CalendarContract.java revision e6fbf65de6eb8fa3ef87291d86de426e568c19eb
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.provider;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik
203672696dc542674f8b54f83cd00c616b4a9fd4adRoboErikimport android.annotation.SdkConstant;
213672696dc542674f8b54f83cd00c616b4a9fd4adRoboErikimport android.annotation.SdkConstant.SdkConstantType;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.AlarmManager;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent;
2464a556d755d27b1182897e9243cf4f3016e76a88Marc Blankimport android.content.ContentProviderClient;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentUris;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
29328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintanaimport android.content.CursorEntityIterator;
30328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintanaimport android.content.Entity;
3164a556d755d27b1182897e9243cf4f3016e76a88Marc Blankimport android.content.EntityIterator;
3264a556d755d27b1182897e9243cf4f3016e76a88Marc Blankimport android.content.Intent;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
34328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintanaimport android.database.DatabaseUtils;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
36cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chanimport android.os.RemoteException;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.format.DateUtils;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.format.Time;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
42260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <p>
43260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * The contract between the calendar provider and applications. Contains
44260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * definitions for the supported URIs and data columns.
45260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </p>
46260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <h3>Overview</h3>
47260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <p>
48260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * CalendarContract defines the data model of calendar and event related
49260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * information. This data is stored in a number of tables:
50260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </p>
51260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <ul>
52260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Calendars} table holds the calendar specific information. Each
53260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * row in this table contains the details for a single calendar, such as the
54260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * name, color, sync info, etc.</li>
55260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Events} table holds the event specific information. Each row
56260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * in this table has the info for a single event. It contains information such
57260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * as event title, location, start time, end time, etc. The event can occur
58260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * one-time or can recur multiple times. Attendees, reminders, and extended
59260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * properties are stored on separate tables and reference the {@link Events#_ID}
60260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * to link them with the event.</li>
61260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Instances} table holds the start and end time for occurrences
62260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * of an event. Each row in this table represents a single occurrence. For
63260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * one-time events there will be a 1:1 mapping of instances to events. For
64260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * recurring events, multiple rows will automatically be generated which
65260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * correspond to multiple occurrences of that event.</li>
66260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Attendees} table holds the event attendee or guest
67260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * information. Each row represents a single guest of an event. It specifies the
68260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * type of guest they are and their attendance response for the event.</li>
69260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Reminders} table holds the alert/notification data. Each row
70260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * represents a single alert for an event. An event can have multiple reminders.
71260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * The number of reminders per event is specified in
72260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * {@link Calendars#MAX_REMINDERS} which is set by the Sync Adapter that owns
73260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * the given calendar. Reminders are specified in minutes before the event and
74260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * have a type.</li>
75260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link ExtendedProperties} table hold opaque data fields used by the
76260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * sync adapter. The provider takes no action with items in this table except to
77260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * delete them when their related events are deleted.</li>
78260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </ul>
79260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <p>
80260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * Other tables include:
81260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </p>
82260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <ul>
83260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>
84260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * {@link SyncState}, which contains free-form data maintained by the sync
85260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * adapters</li>
86260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </ul>
87bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik *
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
89bec6c36b96f7bc415af18abbb142bd51a1741796RoboErikpublic final class CalendarContract {
90c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    private static final String TAG = "Calendar";
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
93c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Broadcast Action: This is the intent that gets fired when an alarm
94c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * notification needs to be posted for a reminder.
95083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     *
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
973672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
98e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik    public static final String ACTION_EVENT_REMINDER = "android.intent.action.EVENT_REMINDER";
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
101c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Intent Extras key: The start time of an event or an instance of a
102c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * recurring event. (milliseconds since epoch)
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
104e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik    public static final String EXTRA_EVENT_BEGIN_TIME = "beginTime";
105c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik
106c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
107c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Intent Extras key: The end time of an event or an instance of a recurring
108c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * event. (milliseconds since epoch)
109c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
110e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik    public static final String EXTRA_EVENT_END_TIME = "endTime";
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
112e9b734dff148d8e70a9604c81d162144becdc45dErik    /**
1137420f1339446cd76723d57b3c5c1bbc92f15f4f0Michael Chan     * Intent Extras key: When creating an event, set this to true to create an
1147420f1339446cd76723d57b3c5c1bbc92f15f4f0Michael Chan     * all-day event by default
1157420f1339446cd76723d57b3c5c1bbc92f15f4f0Michael Chan     */
1167420f1339446cd76723d57b3c5c1bbc92f15f4f0Michael Chan    public static final String EXTRA_EVENT_ALL_DAY = "allDay";
1177420f1339446cd76723d57b3c5c1bbc92f15f4f0Michael Chan
1187420f1339446cd76723d57b3c5c1bbc92f15f4f0Michael Chan    /**
119c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * This authority is used for writing to or querying from the calendar
120c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * provider. Note: This is set at first run and cannot be changed without
121c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * breaking apps that access the provider.
122e9b734dff148d8e70a9604c81d162144becdc45dErik     */
1231790c13ed68a3fc1f8d91d636caae422a19b1a2aKen Shirriff    public static final String AUTHORITY = "com.android.calendar";
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The content:// style URL for the top-level calendar authority
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
128083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1315b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff     * An optional insert, update or delete URI parameter that allows the caller
132c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * to specify that it is a sync adapter. The default value is false. If set
133c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * to true, the modified row is not marked as "dirty" (needs to be synced)
134c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * and when the provider calls
135c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * {@link ContentResolver#notifyChange(android.net.Uri, android.database.ContentObserver, boolean)}
136c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * , the third parameter "syncToNetwork" is set to false. Furthermore, if
137c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * set to true, the caller must also include
1386f5b4550450d98bb2ae4ac93cefd4133e2a71847Andy McFadden     * {@link Calendars#ACCOUNT_NAME} and {@link Calendars#ACCOUNT_TYPE} as
139c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * query parameters.
140c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     *
1416f5b4550450d98bb2ae4ac93cefd4133e2a71847Andy McFadden     * @see Uri.Builder#appendQueryParameter(java.lang.String, java.lang.String)
1425b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff     */
1435b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff    public static final String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter";
1445b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
145c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
146c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * A special account type for calendars not associated with any account.
147c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Normally calendars that do not match an account on the device will be
148c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * removed. Setting the account_type on a calendar to this will prevent it
149c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * from being wiped if it does not match an existing account.
150c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     *
151c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * @see SyncColumns#ACCOUNT_TYPE
152c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
153c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    public static final String ACCOUNT_TYPE_LOCAL = "LOCAL";
154c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
1555b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff    /**
1563672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik     * This utility class cannot be instantiated
1573672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik     */
1583672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    private CalendarContract() {}
1593672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
1603672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    /**
161c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Generic columns for use by sync adapters. The specific functions of these
162c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * columns are private to the sync adapter. Other clients of the API should
163c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * not attempt to either read or write this column. These columns are
164c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * editable as part of the Calendars Uri, but can only be read if accessed
165c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * through any other Uri.
16636f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio     */
167c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    protected interface CalendarSyncColumns {
16836f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio
1699734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
1709734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
1719734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
1729734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
1739734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
174be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik        public static final String CAL_SYNC1 = "cal_sync1";
1759734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
1769734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
1779734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
1789734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
1799734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
180be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik        public static final String CAL_SYNC2 = "cal_sync2";
1819734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
1829734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
1839734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
1849734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
1859734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
186be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik        public static final String CAL_SYNC3 = "cal_sync3";
1879734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
1889734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
1899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
1909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
1919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
192be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik        public static final String CAL_SYNC4 = "cal_sync4";
1939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
1949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
1959734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
1969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
1979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
198be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik        public static final String CAL_SYNC5 = "cal_sync5";
1999734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
2009734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
2019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
2029734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
2039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
204be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik        public static final String CAL_SYNC6 = "cal_sync6";
2059734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
2069734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
2079734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
2089734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
2099734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
2109734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAL_SYNC7 = "cal_sync7";
2119734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
2129734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
2139734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
2149734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
2159734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
2169734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAL_SYNC8 = "cal_sync8";
2179734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
2189734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
2199734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
2209734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
2219734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
2229734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAL_SYNC9 = "cal_sync9";
2239734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
2249734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
2259734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
2269734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
2279734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
2289734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAL_SYNC10 = "cal_sync10";
22936f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio    }
23036f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio
23136f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio    /**
232c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Columns for Sync information used by Calendars and Events tables. These
233c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * have specific uses which are expected to be consistent by the app and
234c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * sync adapter.
235c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     *
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2370025860b61c1b9e8e7d1da7edd7a8ad837b87078RoboErik    protected interface SyncColumns extends CalendarSyncColumns {
238328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
239c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The account that was used to sync the entry to the device. If the
240c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * account_type is not {@link #ACCOUNT_TYPE_LOCAL} then the name and
241c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * type must match an account on the device or the calendar will be
242c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * deleted.
243328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         * <P>Type: TEXT</P>
244328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
245651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String ACCOUNT_NAME = "account_name";
246328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
247328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
248c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The type of the account that was used to sync the entry to the
249c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * device. A type of {@link #ACCOUNT_TYPE_LOCAL} will keep this event
250c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * form being deleted if there are no matching accounts on the device.
251328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         * <P>Type: TEXT</P>
252328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
253651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String ACCOUNT_TYPE = "account_type";
254328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
255328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
256c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The unique ID for a row assigned by the sync source. NULL if the row
257c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * has never been synced. This is used as a reference id for exceptions
258c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * along with {@link BaseColumns#_ID}.
259328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         * <P>Type: TEXT</P>
260328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
261328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        public static final String _SYNC_ID = "_sync_id";
262328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
263328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
2649734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Used to indicate that local, unsynced, changes are present.
265328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         * <P>Type: INTEGER (long)</P>
266328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
2679734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String DIRTY = "dirty";
268328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
269328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
2709734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Whether the row has been deleted but not synced to the server. A
2719734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * deleted row should be ignored.
2729734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>
2739734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Type: INTEGER (boolean)
2749734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * </P>
275328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
2769734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String DELETED = "deleted";
27715049e46f7331b64bd3093e1d9a0365ca5caf3aeKen Shirriff
278866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        /**
279866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * If set to 1 this causes events on this calendar to be duplicated with
2800025860b61c1b9e8e7d1da7edd7a8ad837b87078RoboErik         * {@link Events#LAST_SYNCED} set to 1 whenever the event
2819734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * transitions from non-dirty to dirty. The duplicated event will not be
2829734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * expanded in the instances table and will only show up in sync adapter
2839734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * queries of the events table. It will also be deleted when the
284866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * originating event has its dirty flag cleared by the sync adapter.
285866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * <P>Type: INTEGER (boolean)</P>
286866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         */
287866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        public static final String CAN_PARTIALLY_UPDATE = "canPartiallyUpdate";
288c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    }
289c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
290c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    /**
291c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Columns specific to the Calendars Uri that other Uris can query.
292c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     */
293e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik    protected interface CalendarColumns {
294c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
2954f52061b51325d8de189eb2cb1c1272b2740b8f8RoboErik         * The color of the calendar. This should only be updated by the sync
2964f52061b51325d8de189eb2cb1c1272b2740b8f8RoboErik         * adapter, not other apps, as changing a calendar's color can adversely
2974f52061b51325d8de189eb2cb1c1272b2740b8f8RoboErik         * affect its display.
298c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: INTEGER (color value)</P>
299c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
300651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String CALENDAR_COLOR = "calendar_color";
301c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
302c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
303f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * An index for looking up a color from the {@link Colors} table. NULL
304f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * or an empty string are reserved for indicating that the calendar does
305f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * not use an index for looking up the color. The provider will update
306f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link #CALENDAR_COLOR} automatically when a valid index is written
307f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * to this column. @see Colors
308f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>
309f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * Type: TEXT
310f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * </P>
311f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * TODO UNHIDE
312fced9521be9abfeb59f0edbbc98922f85264e7bdRoboErik         *
313f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * @hide
314f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
315f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final String CALENDAR_COLOR_INDEX = "calendar_color_index";
316f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
317f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
3189734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * The display name of the calendar. Column name.
319f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>
320f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * Type: TEXT
321f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * </P>
3229734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
3239734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CALENDAR_DISPLAY_NAME = "calendar_displayName";
3249734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
3259734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
326c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * The level of access that the user has for the calendar
327c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: INTEGER (one of the values below)</P>
328c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
3299734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CALENDAR_ACCESS_LEVEL = "calendar_access_level";
330c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
331c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Cannot access the calendar */
3329734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_NONE = 0;
333c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Can only see free/busy information about the calendar */
3349734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_FREEBUSY = 100;
335c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Can read all event details */
3369734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_READ = 200;
337c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /** Can reply yes/no/maybe to an event */
3389734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_RESPOND = 300;
339c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /** not used */
3409734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_OVERRIDE = 400;
341c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /** Full access to modify the calendar, but not the access control
342c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * settings
343c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
3449734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_CONTRIBUTOR = 500;
345c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /** Full access to modify the calendar, but not the access control
346c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * settings
347c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
3489734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_EDITOR = 600;
349c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Full access to the calendar */
3509734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_OWNER = 700;
351c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Domain admin */
3529734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_ROOT = 800;
353c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
354c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
355c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * Is the calendar selected to be displayed?
356c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * 0 - do not show events associated with this calendar.
357c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * 1 - show events associated with this calendar
358c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: INTEGER (boolean)</P>
359c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
360df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden        public static final String VISIBLE = "visible";
361c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
362c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
363c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The time zone the calendar is associated with.
364c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: TEXT</P>
365c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
3669734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CALENDAR_TIME_ZONE = "calendar_timezone";
367c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
368c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
369c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Is this calendar synced and are its events stored on the device?
370c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * 0 - Do not sync this calendar or store events for this calendar.
371c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * 1 - Sync down events for this calendar.
372c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <p>Type: INTEGER (boolean)</p>
373c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
374c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        public static final String SYNC_EVENTS = "sync_events";
375c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
376c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
3779734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * The owner account for this calendar, based on the calendar feed.
3789734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This will be different from the _SYNC_ACCOUNT for delegated calendars.
3799734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Column name.
3809734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: String</P>
381c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
3829734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String OWNER_ACCOUNT = "ownerAccount";
383c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
384c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
3859734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Can the organizer respond to the event?  If no, the status of the
3869734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * organizer should not be shown by the UI.  Defaults to 1. Column name.
387c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: INTEGER (boolean)</P>
388c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
3899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAN_ORGANIZER_RESPOND = "canOrganizerRespond";
3909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
3919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
3929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Can the organizer modify the time zone of the event? Column name.
3939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: INTEGER (boolean)</P>
3949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        */
3959734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAN_MODIFY_TIME_ZONE = "canModifyTimeZone";
3969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
3979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
3989734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * The maximum number of reminders allowed for an event. Column name.
3999734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: INTEGER</P>
4009734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
4019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String MAX_REMINDERS = "maxReminders";
4029734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
4039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
4049734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * A comma separated list of reminder methods supported for this
4059734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * calendar in the format "#,#,#". Valid types are
4069734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * {@link Reminders#METHOD_DEFAULT}, {@link Reminders#METHOD_ALERT},
4079734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * {@link Reminders#METHOD_EMAIL}, {@link Reminders#METHOD_SMS}. Column
4089734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * name.
4099734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
4109734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
4119734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String ALLOWED_REMINDERS = "allowedReminders";
412f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
413f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
414f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * A comma separated list of availability types supported for this
415f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * calendar in the format "#,#,#". Valid types are
416f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link Events#AVAILABILITY_BUSY}, {@link Events#AVAILABILITY_FREE},
417f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link Events#AVAILABILITY_TENTATIVE}. Setting this field to only
418f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link Events#AVAILABILITY_BUSY} should be used to indicate that
419f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * changing the availability is not supported.
420f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         *
421f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * TODO UNHIDE, Update Calendars doc
422f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         *
423f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * @hide
424f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
425f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final String ALLOWED_AVAILABILITY = "allowedAvailability";
426f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
427f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
428f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * A comma separated list of attendee types supported for this calendar
429f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * in the format "#,#,#". Valid types are {@link Attendees#TYPE_NONE},
430f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link Attendees#TYPE_OPTIONAL}, {@link Attendees#TYPE_REQUIRED},
431f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link Attendees#TYPE_RESOURCE}. Setting this field to only
432f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link Attendees#TYPE_NONE} should be used to indicate that changing
433f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * the attendee type is not supported.
434f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         *
435f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * TODO UNHIDE, Update Calendars doc
436f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         *
437f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * @hide
438f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
439f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final String ALLOWED_ATTENDEE_TYPES = "allowedAttendeeTypes";
440c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    }
441c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
442c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    /**
443c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     * Class that represents a Calendar Entity. There is one entry per calendar.
444c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * This is a helper class to make batch operations easier.
445c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     */
4463672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    public static final class CalendarEntity implements BaseColumns, SyncColumns, CalendarColumns {
447c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
448c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
449c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The default Uri used when creating a new calendar EntityIterator.
450c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
451c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
452c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
453c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                "/calendar_entities");
454c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
455c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
4563672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
4573672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
4583672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private CalendarEntity() {}
4593672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
4603672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
461c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Creates an entity iterator for the given cursor. It assumes the
462c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * cursor contains a calendars query.
463c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
464c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cursor query on {@link #CONTENT_URI}
465c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return an EntityIterator of calendars
466c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
467c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        public static EntityIterator newEntityIterator(Cursor cursor) {
468c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            return new EntityIteratorImpl(cursor);
469c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        }
470c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
471c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        private static class EntityIteratorImpl extends CursorEntityIterator {
472c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
473c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            public EntityIteratorImpl(Cursor cursor) {
474c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                super(cursor);
475c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio            }
476c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
477c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio            @Override
478c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio            public Entity getEntityAndIncrementCursor(Cursor cursor) throws RemoteException {
479c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // we expect the cursor is already at the row we need to read from
480c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                final long calendarId = cursor.getLong(cursor.getColumnIndexOrThrow(_ID));
481c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
482c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // Create the content value
483c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                ContentValues cv = new ContentValues();
484c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                cv.put(_ID, calendarId);
485c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
486651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ACCOUNT_NAME);
487651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ACCOUNT_TYPE);
488c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
489c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_ID);
490651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DIRTY);
491c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
4929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC1);
4939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC2);
4949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC3);
4959734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC4);
4969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC5);
4979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC6);
4989734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC7);
4999734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC8);
5009734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC9);
5019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC10);
502c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
503c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, Calendars.NAME);
504c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
5059734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                        Calendars.CALENDAR_DISPLAY_NAME);
506866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
507866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                        Calendars.CALENDAR_COLOR);
5089734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, CALENDAR_ACCESS_LEVEL);
509df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, VISIBLE);
510c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, SYNC_EVENTS);
511651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
512651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                        Calendars.CALENDAR_LOCATION);
5139734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CALENDAR_TIME_ZONE);
514c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
515c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                        Calendars.OWNER_ACCOUNT);
516c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
517df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                        Calendars.CAN_ORGANIZER_RESPOND);
518df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
519df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                        Calendars.CAN_MODIFY_TIME_ZONE);
520df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
521df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                        Calendars.MAX_REMINDERS);
522866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
523866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                        Calendars.CAN_PARTIALLY_UPDATE);
5249734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
5259734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                        Calendars.ALLOWED_REMINDERS);
526c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
527c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, DELETED);
528c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
529c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // Create the Entity from the ContentValue
530c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                Entity entity = new Entity(cv);
531c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
532c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // Set cursor to next row
533c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                cursor.moveToNext();
534c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
535c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // Return the created Entity
536c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                return entity;
537c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio            }
538c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        }
539c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     }
540c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
541c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    /**
542f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * Constants and helpers for the Calendars table, which contains details for
543f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * individual calendars. <h3>Operations</h3> All operations can be done
544f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * either as an app or as a sync adapter. To perform an operation as a sync
545f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * adapter {@link #CALLER_IS_SYNCADAPTER} should be set to true and
546f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #ACCOUNT_NAME} and {@link #ACCOUNT_TYPE} must be set in the Uri
547f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * parameters. See
548f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link Uri.Builder#appendQueryParameter(java.lang.String, java.lang.String)}
549f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * for details on adding parameters. Sync adapters have write access to more
550f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * columns but are restricted to a single account at a time. Calendars are
551f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * designed to be primarily managed by a sync adapter and inserting new
552f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * calendars should be done as a sync adapter. For the most part, apps
553f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * should only update calendars (such as changing the color or display
554f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * name). If a local calendar is required an app can do so by inserting as a
555f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * sync adapter and using an {@link #ACCOUNT_TYPE} of
556f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #ACCOUNT_TYPE_LOCAL} .
557f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dl>
558f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dt><b>Insert</b></dt>
559f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>When inserting a new calendar the following fields must be included:
560f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <ul>
561f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ACCOUNT_NAME}</li>
562f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ACCOUNT_TYPE}</li>
563f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #NAME}</li>
564f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_DISPLAY_NAME}</li>
565f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_COLOR}</li>
566f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_ACCESS_LEVEL}</li>
567f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #OWNER_ACCOUNT}</li>
568f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </ul>
569f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * The following fields are not required when inserting a Calendar but are
570f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * generally a good idea to include:
571f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <ul>
572f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #SYNC_EVENTS} set to 1</li>
573f92ccfb8b0e2062e5170ea649cdc01692b09a683RoboErik     * <li>{@link #CALENDAR_TIME_ZONE}</li>
574f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ALLOWED_REMINDERS}</li>
575f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </ul>
576f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dt><b>Update</b></dt>
577f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>To perform an update on a calendar the {@link #_ID} of the calendar
578f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * should be provided either as an appended id to the Uri (
579f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link ContentUris#withAppendedId}) or as the first selection item--the
580f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * selection should start with "_id=?" and the first selectionArg should be
581f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * the _id of the calendar. Calendars may also be updated using a selection
582f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * without the id. In general, the {@link #ACCOUNT_NAME} and
583f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #ACCOUNT_TYPE} should not be changed after a calendar is created
584f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * as this can cause issues for sync adapters.
585f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dt><b>Delete</b></dt>
586f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>Calendars can be deleted either by the {@link #_ID} as an appended id
587f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * on the Uri or using any standard selection. Deleting a calendar should
588f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * generally be handled by a sync adapter as it will remove the calendar
589f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * from the database and all associated data (aka events).</dd>
590f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dt><b>Query</b></dt>
591f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>Querying the Calendars table will get you all information about a set
592f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * of calendars. There will be one row returned for each calendar that
593f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * matches the query selection, or at most a single row if the {@link #_ID}
594f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * is appended to the Uri.</dd>
595f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </dl>
596f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <h3>Calendar Columns</h3> The following Calendar columns are writable by
597f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * both an app and a sync adapter.
598f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <ul>
599f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #NAME}</li>
600f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_DISPLAY_NAME}</li>
601f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #VISIBLE}</li>
602f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #SYNC_EVENTS}</li>
603f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </ul>
604f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * The following Calendars columns are writable only by a sync adapter
605f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <ul>
606f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ACCOUNT_NAME}</li>
607f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ACCOUNT_TYPE}</li>
6084f52061b51325d8de189eb2cb1c1272b2740b8f8RoboErik     * <li>{@link #CALENDAR_COLOR}</li>
609f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #_SYNC_ID}</li>
610f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #DIRTY}</li>
611f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #OWNER_ACCOUNT}</li>
612f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #MAX_REMINDERS}</li>
613f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ALLOWED_REMINDERS}</li>
614f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAN_MODIFY_TIME_ZONE}</li>
615f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAN_ORGANIZER_RESPOND}</li>
616f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAN_PARTIALLY_UPDATE}</li>
617f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_LOCATION}</li>
618f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_TIME_ZONE}</li>
619f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_ACCESS_LEVEL}</li>
620f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #DELETED}</li>
621f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC1}</li>
622f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC2}</li>
623f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC3}</li>
624f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC4}</li>
625f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC5}</li>
626f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC6}</li>
627f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC7}</li>
628f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC8}</li>
629f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC9}</li>
630f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC10}</li>
631f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </ul>
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6333672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    public static final class Calendars implements BaseColumns, SyncColumns, CalendarColumns {
6343672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
6353672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
6363672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
6373672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
6383672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Calendars() {}
6393672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
641c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for accessing Calendars
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
643c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
6441dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/calendars");
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
649e5e0250dd23d0ff718a26350f3076884235b8c0eMichael Chan        public static final String DEFAULT_SORT_ORDER = CALENDAR_DISPLAY_NAME;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
652c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The name of the calendar. Column name.
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NAME = "name";
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
658c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The default location for the calendar. Column name.
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
661651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String CALENDAR_LOCATION = "calendar_location";
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6646efb30f40a19a9639076b08df4f64d335c8946a0RoboErik         * These fields are only writable by a sync adapter. To modify them the
665c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * caller must include {@link #CALLER_IS_SYNCADAPTER},
6669734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * {@link #ACCOUNT_NAME}, and {@link #ACCOUNT_TYPE} in the Uri's query
667083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * parameters. TODO move to provider
668083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         *
669083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
6706efb30f40a19a9639076b08df4f64d335c8946a0RoboErik         */
6716efb30f40a19a9639076b08df4f64d335c8946a0RoboErik        public static final String[] SYNC_WRITABLE_COLUMNS = new String[] {
672651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            ACCOUNT_NAME,
673651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            ACCOUNT_TYPE,
6746efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            _SYNC_ID,
675651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            DIRTY,
6766efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            OWNER_ACCOUNT,
6776efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            MAX_REMINDERS,
678f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik            ALLOWED_REMINDERS,
6796efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            CAN_MODIFY_TIME_ZONE,
6806efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            CAN_ORGANIZER_RESPOND,
681866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert            CAN_PARTIALLY_UPDATE,
682651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            CALENDAR_LOCATION,
6839734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CALENDAR_TIME_ZONE,
6849734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CALENDAR_ACCESS_LEVEL,
6856efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            DELETED,
686be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik            CAL_SYNC1,
687be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik            CAL_SYNC2,
688be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik            CAL_SYNC3,
689be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik            CAL_SYNC4,
690c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            CAL_SYNC5,
691c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            CAL_SYNC6,
6929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CAL_SYNC7,
6939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CAL_SYNC8,
6949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CAL_SYNC9,
6959734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CAL_SYNC10,
6966efb30f40a19a9639076b08df4f64d335c8946a0RoboErik        };
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    /**
700c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     * Columns from the Attendees table that other tables join into themselves.
701c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     */
702b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface AttendeesColumns {
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
705c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The id of the event. Column name.
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
711c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The name of the attendee. Column name.
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: STRING</P>
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_NAME = "attendeeName";
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
717c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The email address of the attendee. Column name.
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: STRING</P>
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_EMAIL = "attendeeEmail";
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
723c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The relationship of the attendee to the user. Column name.
724c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (one of {@link #RELATIONSHIP_ATTENDEE}, ...}.</P>
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_RELATIONSHIP = "attendeeRelationship";
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_NONE = 0;
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_ATTENDEE = 1;
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_ORGANIZER = 2;
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_PERFORMER = 3;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_SPEAKER = 4;
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
735c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The type of attendee. Column name.
736f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>
737fced9521be9abfeb59f0edbbc98922f85264e7bdRoboErik         * Type: Integer (one of {@link #TYPE_REQUIRED}, {@link #TYPE_OPTIONAL}
738f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * </P>
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_TYPE = "attendeeType";
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TYPE_NONE = 0;
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TYPE_REQUIRED = 1;
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TYPE_OPTIONAL = 2;
745f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
746f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * This specifies that an attendee is a resource, such as a room, and
747fced9521be9abfeb59f0edbbc98922f85264e7bdRoboErik         * not an actual person. TODO UNHIDE and add to ATTENDEE_TYPE comment
74805b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik         *
749f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * @hide
750f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
751f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final int TYPE_RESOURCE = 3;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
754c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The attendance status of the attendee. Column name.
755c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: Integer (one of {@link #ATTENDEE_STATUS_ACCEPTED}, ...).</P>
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_STATUS = "attendeeStatus";
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_NONE = 0;
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_ACCEPTED = 1;
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_DECLINED = 2;
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_INVITED = 3;
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_TENTATIVE = 4;
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
766c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
7673771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * Fields and helpers for interacting with Attendees. Each row of this table
7683771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * represents a single attendee or guest of an event. Calling
76958644028f909ecb429b26f909bedfb62a153d4e4RoboErik     * {@link #query(ContentResolver, long, String[])} will return a list of attendees for
7703771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * the event with the given eventId. Both apps and sync adapters may write
7713771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * to this table. There are six writable fields and all of them except
7723771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * {@link #ATTENDEE_NAME} must be included when inserting a new attendee.
7733771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * They are:
7743771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <ul>
7753771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #EVENT_ID}</li>
7763771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_NAME}</li>
7773771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_EMAIL}</li>
7783771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_RELATIONSHIP}</li>
7793771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_TYPE}</li>
7803771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_STATUS}</li>
7813771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * </ul>
782c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
7831dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio    public static final class Attendees implements BaseColumns, AttendeesColumns, EventsColumns {
784c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik
785c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
786c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for accessing Attendees data
787c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
788c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
7891dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/attendees");
790c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=?";
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
792c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
7933672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
7943672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
7953672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Attendees() {}
7963672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
7973672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
798c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Queries all attendees associated with the given event. This is a
799c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * blocking call and should not be done on the UI thread.
8003672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         *
801c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cr The content resolver to use for the query
802c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param eventId The id of the event to retrieve attendees for
80358644028f909ecb429b26f909bedfb62a153d4e4RoboErik         * @param projection the columns to return in the cursor
804c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return A Cursor containing all attendees for the event
805c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
80658644028f909ecb429b26f909bedfb62a153d4e4RoboErik        public static final Cursor query(ContentResolver cr, long eventId, String[] projection) {
807c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            String[] attArgs = {Long.toString(eventId)};
80858644028f909ecb429b26f909bedfb62a153d4e4RoboErik            return cr.query(CONTENT_URI, projection, ATTENDEES_WHERE, attArgs /* selection args */,
809c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                    null /* sort order */);
810c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Columns from the Events table that other tables join into themselves.
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
816b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface EventsColumns {
817df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden
818df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden        /**
819c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The {@link Calendars#_ID} of the calendar the event belongs to.
820c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Column name.
821c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER</P>
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CALENDAR_ID = "calendar_id";
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
826c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The title of the event. Column name.
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String TITLE = "title";
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
832c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The description of the event. Column name.
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DESCRIPTION = "description";
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
838c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Where the event takes place. Column name.
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_LOCATION = "eventLocation";
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
844f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * A secondary color for the individual event. This should only be
845f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * updated by the sync adapter for a given account.
8469734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: INTEGER</P>
8479734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8489734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String EVENT_COLOR = "eventColor";
8499734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8509734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
851f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * A secondary color index for the individual event. NULL or an empty
852f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * string are reserved for indicating that the event does not use an
853f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * index for looking up the color. The provider will update
854f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link #EVENT_COLOR} automatically when a valid index is written to
855f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * this column. @see Colors
856f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>Type: TEXT</P>
857f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * TODO UNHIDE
858f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         *
859f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * @hide
860f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
861f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final String EVENT_COLOR_INDEX = "eventColor_index";
862f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
863f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
864c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The event status. Column name.
865c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (one of {@link #STATUS_TENTATIVE}...)</P>
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String STATUS = "eventStatus";
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int STATUS_TENTATIVE = 0;
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int STATUS_CONFIRMED = 1;
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int STATUS_CANCELED = 2;
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This is a copy of the attendee status for the owner of this event.
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This field is copied here so that we can efficiently filter out
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * events that are declined without having to look in the Attendees
877c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * table. Column name.
8785b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff         *
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String SELF_ATTENDEE_STATUS = "selfAttendeeStatus";
8825b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
884c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * This column is available for use by sync adapters. Column name.
88564a556d755d27b1182897e9243cf4f3016e76a88Marc Blank         * <P>Type: TEXT</P>
88664a556d755d27b1182897e9243cf4f3016e76a88Marc Blank         */
887651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String SYNC_DATA1 = "sync_data1";
88864a556d755d27b1182897e9243cf4f3016e76a88Marc Blank
88964a556d755d27b1182897e9243cf4f3016e76a88Marc Blank        /**
8909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA2 = "sync_data2";
8949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8959734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
8969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8989734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8999734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA3 = "sync_data3";
9009734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
9029734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
9039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
9049734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
9059734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA4 = "sync_data4";
9069734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9079734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
9089734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
9099734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
9109734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
9119734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA5 = "sync_data5";
9129734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9139734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
9149734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
9159734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
9169734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
9179734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA6 = "sync_data6";
9189734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9199734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
9209734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
921866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * <P>Type: TEXT</P>
922866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         */
923866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        public static final String SYNC_DATA7 = "sync_data7";
924866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert
925866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        /**
9269734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
9279734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
9289734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
9299734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA8 = "sync_data8";
9309734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9319734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
9329734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
9339734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
9349734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
9359734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA9 = "sync_data9";
9369734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9379734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
9389734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
9399734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
9409734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
9419734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA10 = "sync_data10";
9429734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9439734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
944866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * Used to indicate that a row is not a real event but an original copy of a locally
945866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * modified event. A copy is made when an event changes from non-dirty to dirty and the
946866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * event is on a calendar with {@link Calendars#CAN_PARTIALLY_UPDATE} set to 1. This copy
947866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * does not get expanded in the instances table and is only visible in queries made by a
948866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * sync adapter. The copy gets removed when the event is changed back to non-dirty by a
949866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * sync adapter.
950866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * <P>Type: INTEGER (boolean)</P>
951866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         */
952866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        public static final String LAST_SYNCED = "lastSynced";
953866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert
954866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        /**
955c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The time the event starts in UTC millis since epoch. Column name.
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DTSTART = "dtstart";
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
961c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The time the event ends in UTC millis since epoch. Column name.
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DTEND = "dtend";
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
967c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The duration of the event in RFC2445 format. Column name.
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT (duration in RFC2445 format)</P>
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DURATION = "duration";
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
973c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The timezone for the event. Column name.
974c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: TEXT</P>
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_TIMEZONE = "eventTimezone";
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
979c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The timezone for the end time of the event. Column name.
980c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: TEXT</P>
981c07b06f12ac1f93b35f3e120a5e7d6aa5f934c6fErik         */
982651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String EVENT_END_TIMEZONE = "eventEndTimezone";
983c07b06f12ac1f93b35f3e120a5e7d6aa5f934c6fErik
984c07b06f12ac1f93b35f3e120a5e7d6aa5f934c6fErik        /**
985c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Is the event all day (time zone independent). Column name.
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ALL_DAY = "allDay";
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
991651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Defines how the event shows up for others when the calendar is
992c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * shared. Column name.
993c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (One of {@link #ACCESS_DEFAULT}, ...)</P>
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
995651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String ACCESS_LEVEL = "accessLevel";
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
997651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
998651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Default access is controlled by the server and will be treated as
999651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * public on the device.
1000651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1001651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int ACCESS_DEFAULT = 0;
1002651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1003651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Confidential is not used by the app.
1004651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1005651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int ACCESS_CONFIDENTIAL = 1;
1006651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1007c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Private shares the event as a free/busy slot with no details.
1008651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1009651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int ACCESS_PRIVATE = 2;
1010651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1011c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Public makes the contents visible to anyone with access to the
1012651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * calendar.
1013651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1014651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int ACCESS_PUBLIC = 3;
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1017651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * If this event counts as busy time or is still free time that can be
1018c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * scheduled over. Column name.
1019c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (One of {@link #AVAILABILITY_BUSY},
1020c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * {@link #AVAILABILITY_FREE})</P>
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1022651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String AVAILABILITY = "availability";
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1024651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1025651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Indicates that this event takes up time and will conflict with other
1026651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * events.
1027651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1028651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int AVAILABILITY_BUSY = 0;
1029651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1030651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Indicates that this event is free time and will not conflict with
1031651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * other events.
1032651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1033651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int AVAILABILITY_FREE = 1;
1034f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
1035f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * Indicates that the owner's availability may change, but should be
1036f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * considered busy time that will conflict.
1037f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         *
1038f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * TODO UNHIDE
1039f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         *
1040f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * @hide
1041f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
1042f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final int AVAILABILITY_TENTATIVE = 2;
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1045c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether the event has an alarm or not. Column name.
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String HAS_ALARM = "hasAlarm";
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1051c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether the event has extended properties or not. Column name.
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String HAS_EXTENDED_PROPERTIES = "hasExtendedProperties";
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1057c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The recurrence rule for the event. Column name.
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String RRULE = "rrule";
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1063c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The recurrence dates for the event. Column name.
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String RDATE = "rdate";
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1069c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The recurrence exception rule for the event. Column name.
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EXRULE = "exrule";
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1075c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The recurrence exception dates for the event. Column name.
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EXDATE = "exdate";
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1081c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The {@link Events#_ID} of the original recurring event for which this
1082c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * event is an exception. Column name.
1083c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik         * <P>Type: TEXT</P>
1084c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik         */
1085c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik        public static final String ORIGINAL_ID = "original_id";
1086c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik
1087c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik        /**
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The _sync_id of the original recurring event for which this event is
1089c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik         * an exception. The provider should keep the original_id in sync when
1090c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * this is updated. Column name.
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1093651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String ORIGINAL_SYNC_ID = "original_sync_id";
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The original instance time of the recurring event for which this
1097c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * event is an exception. Column name.
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ORIGINAL_INSTANCE_TIME = "originalInstanceTime";
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The allDay status (true or false) of the original recurring event
1104c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * for which this event is an exception. Column name.
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ORIGINAL_ALL_DAY = "originalAllDay";
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1110c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The last date this event repeats on, or NULL if it never ends. Column
1111c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * name.
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String LAST_DATE = "lastDate";
111579f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff
111679f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff        /**
111779f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff         * Whether the event has attendee information.  True if the event
111879f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff         * has full attendee data, false if the event has information about
1119c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * self only. Column name.
112079f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff         * <P>Type: INTEGER (boolean)</P>
112179f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff         */
112279f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff        public static final String HAS_ATTENDEE_DATA = "hasAttendeeData";
11233d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
11243d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1125c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether guests can modify the event. Column name.
11263d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: INTEGER (boolean)</P>
11273d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
11283d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String GUESTS_CAN_MODIFY = "guestsCanModify";
11293d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
11303d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1131c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether guests can invite other guests. Column name.
11323d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: INTEGER (boolean)</P>
11333d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
11343d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String GUESTS_CAN_INVITE_OTHERS = "guestsCanInviteOthers";
11353d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
11363d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1137c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether guests can see the list of attendees. Column name.
11383d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: INTEGER (boolean)</P>
11393d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
11403d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String GUESTS_CAN_SEE_GUESTS = "guestsCanSeeGuests";
11413d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
11423d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1143c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Email of the organizer (owner) of the event. Column name.
11443d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: STRING</P>
11453d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
11463d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String ORGANIZER = "organizer";
11473d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
11483d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1149c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether the user can invite others to the event. The
1150c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * GUESTS_CAN_INVITE_OTHERS is a setting that applies to an arbitrary
1151c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * guest, while CAN_INVITE_OTHERS indicates if the user can invite
1152c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * others (either through GUESTS_CAN_INVITE_OTHERS or because the user
1153c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * has modify access to the event). Column name.
11543d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: INTEGER (boolean, readonly)</P>
11553d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
11563d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String CAN_INVITE_OTHERS = "canInviteOthers";
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1160c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Class that represents an Event Entity. There is one entry per event.
1161c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Recurring events show up as a single entry. This is a helper class to
1162c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * make batch operations easier. A {@link ContentResolver} or
1163c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * {@link ContentProviderClient} is required as the helper does additional
1164c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * queries to add reminders and attendees to each entry.
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1166651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik    public static final class EventsEntity implements BaseColumns, SyncColumns, EventsColumns {
1167328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
1168328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         * The content:// style URL for this table
1169328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
1170a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
1171a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                "/event_entities");
1172328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1173c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
11743672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
11753672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
11763672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private EventsEntity() {}
11773672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
11783672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
1179c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Creates a new iterator for events
1180c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
1181c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cursor An event query
1182c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param resolver For performing additional queries
1183c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return an EntityIterator containing one entity per event in the
1184c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         cursor
1185c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
1186328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        public static EntityIterator newEntityIterator(Cursor cursor, ContentResolver resolver) {
1187328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            return new EntityIteratorImpl(cursor, resolver);
1188328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        }
1189328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1190c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1191c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Creates a new iterator for events
1192c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
1193c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cursor An event query
1194c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param provider For performing additional queries
1195c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return an EntityIterator containing one entity per event in the
1196c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         cursor
1197c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
1198328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        public static EntityIterator newEntityIterator(Cursor cursor,
1199328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                ContentProviderClient provider) {
1200328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            return new EntityIteratorImpl(cursor, provider);
1201328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        }
1202328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1203328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        private static class EntityIteratorImpl extends CursorEntityIterator {
1204328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private final ContentResolver mResolver;
1205328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private final ContentProviderClient mProvider;
1206328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1207328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final String[] REMINDERS_PROJECTION = new String[] {
1208328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Reminders.MINUTES,
1209328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Reminders.METHOD,
1210328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            };
1211328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_MINUTES = 0;
1212328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_METHOD = 1;
1213328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1214328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final String[] ATTENDEES_PROJECTION = new String[] {
1215328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_NAME,
1216328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_EMAIL,
1217328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_RELATIONSHIP,
1218328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_TYPE,
1219328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_STATUS,
1220328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            };
1221328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_NAME = 0;
1222328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_EMAIL = 1;
1223328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_RELATIONSHIP = 2;
1224328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_TYPE = 3;
1225328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_STATUS = 4;
1226328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final String[] EXTENDED_PROJECTION = new String[] {
12278f643c1040d45f03584b0382c7c5d933388b9103Marc Blank                    ExtendedProperties._ID,
1228328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    ExtendedProperties.NAME,
12298f643c1040d45f03584b0382c7c5d933388b9103Marc Blank                    ExtendedProperties.VALUE
1230328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            };
12318f643c1040d45f03584b0382c7c5d933388b9103Marc Blank            private static final int COLUMN_ID = 0;
12328f643c1040d45f03584b0382c7c5d933388b9103Marc Blank            private static final int COLUMN_NAME = 1;
12338f643c1040d45f03584b0382c7c5d933388b9103Marc Blank            private static final int COLUMN_VALUE = 2;
1234328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
12351dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio            private static final String WHERE_EVENT_ID = "event_id=?";
12361dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
1237328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            public EntityIteratorImpl(Cursor cursor, ContentResolver resolver) {
1238328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                super(cursor);
1239328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                mResolver = resolver;
1240328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                mProvider = null;
1241328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            }
1242328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1243328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            public EntityIteratorImpl(Cursor cursor, ContentProviderClient provider) {
1244328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                super(cursor);
1245328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                mResolver = null;
1246328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                mProvider = provider;
1247328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            }
1248328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
124964a556d755d27b1182897e9243cf4f3016e76a88Marc Blank            @Override
1250328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            public Entity getEntityAndIncrementCursor(Cursor cursor) throws RemoteException {
1251328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                // we expect the cursor is already at the row we need to read from
1252328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                final long eventId = cursor.getLong(cursor.getColumnIndexOrThrow(Events._ID));
1253328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                ContentValues cv = new ContentValues();
1254328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                cv.put(Events._ID, eventId);
1255328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, CALENDAR_ID);
1256328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, TITLE);
1257328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, DESCRIPTION);
1258328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_LOCATION);
1259328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, STATUS);
1260328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, SELF_ATTENDEE_STATUS);
1261328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DTSTART);
1262328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DTEND);
1263328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, DURATION);
1264328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_TIMEZONE);
1265c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_END_TIMEZONE);
1266328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ALL_DAY);
1267651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, ACCESS_LEVEL);
1268651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, AVAILABILITY);
1269328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, HAS_ALARM);
1270328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
1271328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        HAS_EXTENDED_PROPERTIES);
1272328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, RRULE);
1273328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, RDATE);
1274328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EXRULE);
1275328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EXDATE);
1276651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORIGINAL_SYNC_ID);
1277c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORIGINAL_ID);
1278328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv,
1279328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        ORIGINAL_INSTANCE_TIME);
1280328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, ORIGINAL_ALL_DAY);
1281328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, LAST_DATE);
1282328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, HAS_ATTENDEE_DATA);
1283328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
1284328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        GUESTS_CAN_INVITE_OTHERS);
1285328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, GUESTS_CAN_MODIFY);
1286328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, GUESTS_CAN_SEE_GUESTS);
1287328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORGANIZER);
1288328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_ID);
1289651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DIRTY);
1290866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, LAST_SYNCED);
1291c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, DELETED);
12929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA1);
12939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA2);
12949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA3);
12959734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA4);
12969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA5);
12979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA6);
12989734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA7);
12999734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA8);
13009734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA9);
13019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA10);
1302be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC1);
1303be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC2);
1304be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC3);
1305be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC4);
1306be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC5);
1307be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC6);
13089734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC7);
13099734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC8);
13109734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC9);
13119734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC10);
1312328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1313328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                Entity entity = new Entity(cv);
1314328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                Cursor subCursor;
1315328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                if (mResolver != null) {
1316328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mResolver.query(Reminders.CONTENT_URI, REMINDERS_PROJECTION,
13171dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
13181dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) }  /* selectionArgs */,
13191dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1320328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } else {
1321328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mProvider.query(Reminders.CONTENT_URI, REMINDERS_PROJECTION,
13221dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
13231dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) }  /* selectionArgs */,
13241dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1325328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1326328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                try {
1327328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    while (subCursor.moveToNext()) {
1328328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        ContentValues reminderValues = new ContentValues();
1329328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        reminderValues.put(Reminders.MINUTES, subCursor.getInt(COLUMN_MINUTES));
1330328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        reminderValues.put(Reminders.METHOD, subCursor.getInt(COLUMN_METHOD));
1331328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        entity.addSubValue(Reminders.CONTENT_URI, reminderValues);
1332328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    }
1333328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } finally {
1334328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor.close();
1335328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1336328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1337328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                if (mResolver != null) {
1338328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mResolver.query(Attendees.CONTENT_URI, ATTENDEES_PROJECTION,
13391dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
13401dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) } /* selectionArgs */,
13411dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1342328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } else {
1343328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mProvider.query(Attendees.CONTENT_URI, ATTENDEES_PROJECTION,
13441dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
13451dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) } /* selectionArgs */,
13461dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1347328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1348328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                try {
1349328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    while (subCursor.moveToNext()) {
1350328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        ContentValues attendeeValues = new ContentValues();
1351328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_NAME,
1352328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getString(COLUMN_ATTENDEE_NAME));
1353328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_EMAIL,
1354328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getString(COLUMN_ATTENDEE_EMAIL));
1355328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_RELATIONSHIP,
1356328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getInt(COLUMN_ATTENDEE_RELATIONSHIP));
1357328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_TYPE,
1358328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getInt(COLUMN_ATTENDEE_TYPE));
1359328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_STATUS,
1360328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getInt(COLUMN_ATTENDEE_STATUS));
1361328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        entity.addSubValue(Attendees.CONTENT_URI, attendeeValues);
1362328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    }
1363328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } finally {
1364328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor.close();
1365328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1366328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1367328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                if (mResolver != null) {
1368328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mResolver.query(ExtendedProperties.CONTENT_URI, EXTENDED_PROJECTION,
13691dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
13701dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) } /* selectionArgs */,
13711dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1372328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } else {
1373328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mProvider.query(ExtendedProperties.CONTENT_URI, EXTENDED_PROJECTION,
13741dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
13751dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) } /* selectionArgs */,
13761dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1377328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1378328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                try {
1379328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    while (subCursor.moveToNext()) {
1380328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        ContentValues extendedValues = new ContentValues();
13818f643c1040d45f03584b0382c7c5d933388b9103Marc Blank                        extendedValues.put(ExtendedProperties._ID,
13828f643c1040d45f03584b0382c7c5d933388b9103Marc Blank                                subCursor.getString(COLUMN_ID));
13833b16892c6bc6b804133163db24ffc5ff54b9a8fbKen Shirriff                        extendedValues.put(ExtendedProperties.NAME,
13843b16892c6bc6b804133163db24ffc5ff54b9a8fbKen Shirriff                                subCursor.getString(COLUMN_NAME));
1385328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        extendedValues.put(ExtendedProperties.VALUE,
13863b16892c6bc6b804133163db24ffc5ff54b9a8fbKen Shirriff                                subCursor.getString(COLUMN_VALUE));
1387328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        entity.addSubValue(ExtendedProperties.CONTENT_URI, extendedValues);
1388328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    }
1389328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } finally {
1390328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor.close();
1391328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1392328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1393328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                cursor.moveToNext();
1394328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                return entity;
1395328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            }
1396328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        }
1397328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana    }
1398328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1399328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana    /**
1400f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * Constants and helpers for the Events table, which contains details for
1401f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * individual events. <h3>Operations</h3> All operations can be done either
1402f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * as an app or as a sync adapter. To perform an operation as a sync adapter
1403f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #CALLER_IS_SYNCADAPTER} should be set to true and
1404f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #ACCOUNT_NAME} and {@link #ACCOUNT_TYPE} must be set in the Uri
1405f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * parameters. See
1406f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link Uri.Builder#appendQueryParameter(java.lang.String, java.lang.String)}
1407f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * for details on adding parameters. Sync adapters have write access to more
1408f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * columns but are restricted to a single account at a time.
1409fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dl>
1410fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dt><b>Insert</b></dt>
1411fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dd>When inserting a new event the following fields must be included:
1412fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <ul>
1413fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>dtstart</li>
1414e6fbf65de6eb8fa3ef87291d86de426e568c19ebMichael Chan     * <li>dtend if the event is non-recurring</li>
1415e6fbf65de6eb8fa3ef87291d86de426e568c19ebMichael Chan     * <li>duration if the event is recurring</li>
1416e6fbf65de6eb8fa3ef87291d86de426e568c19ebMichael Chan     * <li>rrule or rdate if the event is recurring</li>
1417fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>a calendar_id</li>
1418fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </ul>
1419fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * There are also further requirements when inserting or updating an event.
1420fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * See the section on Writing to Events.</dd>
1421fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dt><b>Update</b></dt>
1422f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>To perform an update of an Event the {@link Events#_ID} of the event
1423f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * should be provided either as an appended id to the Uri (
1424fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * {@link ContentUris#withAppendedId}) or as the first selection item--the
1425fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * selection should start with "_id=?" and the first selectionArg should be
1426f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * the _id of the event. Updates may also be done using a selection and no
1427f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * id. Updating an event must respect the same rules as inserting and is
1428f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * further restricted in the fields that can be written. See the section on
1429f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * Writing to Events.</dd>
1430fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dt><b>Delete</b></dt>
1431fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dd>Events can be deleted either by the {@link Events#_ID} as an appended
1432fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * id on the Uri or using any standard selection. If an appended id is used
1433fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * a selection is not allowed. There are two versions of delete: as an app
1434fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * and as a sync adapter. An app delete will set the deleted column on an
1435fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * event and remove all instances of that event. A sync adapter delete will
1436fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * remove the event from the database and all associated data.</dd>
1437fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dt><b>Query</b></dt>
1438fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dd>Querying the Events table will get you all information about a set of
1439fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * events except their reminders, attendees, and extended properties. There
1440fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * will be one row returned for each event that matches the query selection,
1441fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * or at most a single row if the {@link Events#_ID} is appended to the Uri.
1442fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * Recurring events will only return a single row regardless of the number
1443fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * of times that event repeats.</dd>
1444fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </dl>
1445fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <h3>Writing to Events</h3> There are further restrictions on all Updates
1446fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * and Inserts in the Events table:
1447fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <ul>
1448fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>If allDay is set to 1 eventTimezone must be {@link Time#TIMEZONE_UTC}
1449fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * and the time must correspond to a midnight boundary.</li>
1450fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>Exceptions are not allowed to recur. If rrule or rdate is not empty,
1451fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * original_id and original_sync_id must be empty.</li>
1452fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>In general a calendar_id should not be modified after insertion. This
1453fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * is not explicitly forbidden but many sync adapters will not behave in an
1454fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * expected way if the calendar_id is modified.</li>
1455fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </ul>
1456fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * The following Events columns are writable by both an app and a sync
1457fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * adapter.
1458fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <ul>
1459fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #CALENDAR_ID}</li>
1460fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORGANIZER}</li>
1461fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #TITLE}</li>
1462fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EVENT_LOCATION}</li>
1463fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DESCRIPTION}</li>
1464fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EVENT_COLOR}</li>
1465fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DTSTART}</li>
1466fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DTEND}</li>
1467fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EVENT_TIMEZONE}</li>
1468fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EVENT_END_TIMEZONE}</li>
1469fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DURATION}</li>
1470fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ALL_DAY}</li>
1471fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #RRULE}</li>
1472fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #RDATE}</li>
1473fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EXRULE}</li>
1474fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EXDATE}</li>
1475fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORIGINAL_ID}</li>
1476fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORIGINAL_SYNC_ID}</li>
1477fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORIGINAL_INSTANCE_TIME}</li>
1478fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORIGINAL_ALL_DAY}</li>
1479fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ACCESS_LEVEL}</li>
1480fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #AVAILABILITY}</li>
1481fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #GUESTS_CAN_MODIFY}</li>
1482fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #GUESTS_CAN_INVITE_OTHERS}</li>
1483fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #GUESTS_CAN_SEE_GUESTS}</li>
1484fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </ul>
1485fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * The following Events columns are writable only by a sync adapter
1486fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <ul>
1487fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DIRTY}</li>
1488fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #_SYNC_ID}</li>
1489fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA1}</li>
1490fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA2}</li>
1491fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA3}</li>
1492fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA4}</li>
1493fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA5}</li>
1494fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA6}</li>
1495fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA7}</li>
1496fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA8}</li>
1497fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA9}</li>
1498fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA10}</li>
1499fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </ul>
1500fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * The remaining columns are either updated by the provider only or are
1501fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * views into other tables and cannot be changed through the Events table.
1502328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana     */
15039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik    public static final class Events implements BaseColumns, SyncColumns, EventsColumns,
1504e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            CalendarColumns {
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1506c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1507c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for interacting with events. Appending an
1508c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * event id using {@link ContentUris#withAppendedId(Uri, long)} will
1509c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * specify a single event.
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1511c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri CONTENT_URI =
1513a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                Uri.parse("content://" + AUTHORITY + "/events");
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
15164a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden         * The content:// style URI for recurring event exceptions.  Insertions require an
15174a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden         * appended event ID.  Deletion of exceptions requires both the original event ID and
15184a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden         * the exception event ID (see {@link Uri.Builder#appendPath}).
15194a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden         */
1520083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final Uri CONTENT_EXCEPTION_URI =
15214a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden                Uri.parse("content://" + AUTHORITY + "/exception");
15224a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden
15234a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden        /**
15243672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
15253672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
15263672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Events() {}
15273672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
15283672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1531c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String DEFAULT_SORT_ORDER = "";
1532651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik
1533651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1534651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * These are columns that should only ever be updated by the provider,
1535651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * either because they are views mapped to another table or because they
1536083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * are used for provider only functionality. TODO move to provider
1537083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         *
1538083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
1539651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1540651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static String[] PROVIDER_WRITABLE_COLUMNS = new String[] {
1541651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                ACCOUNT_NAME,
1542c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                ACCOUNT_TYPE,
1543c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC1,
1544c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC2,
1545c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC3,
1546c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC4,
1547c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC5,
1548866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                CAL_SYNC6,
15499734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAL_SYNC7,
15509734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAL_SYNC8,
15519734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAL_SYNC9,
15529734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAL_SYNC10,
15539734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                ALLOWED_REMINDERS,
15549734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CALENDAR_ACCESS_LEVEL,
15559734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CALENDAR_COLOR,
15569734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CALENDAR_TIME_ZONE,
15579734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAN_MODIFY_TIME_ZONE,
15589734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAN_ORGANIZER_RESPOND,
15599734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CALENDAR_DISPLAY_NAME,
1560866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                CAN_PARTIALLY_UPDATE,
15619734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                SYNC_EVENTS,
15629734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                VISIBLE,
1563651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        };
1564651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik
1565651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1566651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * These fields are only writable by a sync adapter. To modify them the
1567651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * caller must include CALLER_IS_SYNCADAPTER, _SYNC_ACCOUNT, and
1568083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * _SYNC_ACCOUNT_TYPE in the query parameters. TODO move to provider.
1569083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         *
1570083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
1571651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1572651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String[] SYNC_WRITABLE_COLUMNS = new String[] {
1573651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            _SYNC_ID,
1574651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            DIRTY,
15759734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA1,
15769734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA2,
15779734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA3,
15789734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA4,
15799734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA5,
15809734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA6,
15819734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA7,
15829734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA8,
15839734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA9,
15849734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA10,
1585651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        };
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1589c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Fields and helpers for interacting with Instances. An instance is a
1590c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * single occurrence of an event including time zone specific start and end
15913771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * days and minutes. The instances table is not writable and only provides a
15923771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * way to query event occurrences.
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1594e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik    public static final class Instances implements BaseColumns, EventsColumns, CalendarColumns {
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1596e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik        private static final String WHERE_CALENDARS_SELECTED = Calendars.VISIBLE + "=?";
1597e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik        private static final String[] WHERE_CALENDARS_ARGS = {
1598e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            "1"
1599e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik        };
16001dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
1601c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
16023672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
16033672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
16043672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Instances() {}
16053672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
16063672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
1607c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Performs a query to return all visible instances in the given range.
1608c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * This is a blocking function and should not be done on the UI thread.
1609c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * This will cause an expansion of recurring events to fill this time
1610c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * range if they are not already expanded and will slow down for larger
1611c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * time ranges with many recurring events.
1612c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
1613c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cr The ContentResolver to use for the query
1614c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param projection The columns to return
1615c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param begin The start of the time range to query in UTC millis since
1616c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
1617c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param end The end of the time range to query in UTC millis since
1618c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
1619c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return A Cursor containing all instances in the given range
1620c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Cursor query(ContentResolver cr, String[] projection,
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                         long begin, long end) {
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri.Builder builder = CONTENT_URI.buildUpon();
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentUris.appendId(builder, begin);
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentUris.appendId(builder, end);
16261dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio            return cr.query(builder.build(), projection, WHERE_CALENDARS_SELECTED,
1627e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik                    WHERE_CALENDARS_ARGS, DEFAULT_SORT_ORDER);
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1630c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1631c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Performs a query to return all visible instances in the given range
1632c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * that match the given query. This is a blocking function and should
1633c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * not be done on the UI thread. This will cause an expansion of
1634c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * recurring events to fill this time range if they are not already
1635c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * expanded and will slow down for larger time ranges with many
1636c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * recurring events.
1637c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
1638c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cr The ContentResolver to use for the query
1639c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param projection The columns to return
1640c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param begin The start of the time range to query in UTC millis since
1641c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
1642c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param end The end of the time range to query in UTC millis since
1643c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
1644c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param searchQuery A string of space separated search terms. Segments
1645c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            enclosed by double quotes will be treated as a single
1646c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            term.
1647c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return A Cursor of instances matching the search terms in the given
1648c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         time range
1649c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Cursor query(ContentResolver cr, String[] projection,
165119f845804c4b8f295669bbe7338d91d42451a0fdMason Tang                                         long begin, long end, String searchQuery) {
165219f845804c4b8f295669bbe7338d91d42451a0fdMason Tang            Uri.Builder builder = CONTENT_SEARCH_URI.buildUpon();
165319f845804c4b8f295669bbe7338d91d42451a0fdMason Tang            ContentUris.appendId(builder, begin);
165419f845804c4b8f295669bbe7338d91d42451a0fdMason Tang            ContentUris.appendId(builder, end);
1655c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            builder = builder.appendPath(searchQuery);
1656e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            return cr.query(builder.build(), projection, WHERE_CALENDARS_SELECTED,
1657e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik                    WHERE_CALENDARS_ARGS, DEFAULT_SORT_ORDER);
165819f845804c4b8f295669bbe7338d91d42451a0fdMason Tang        }
165919f845804c4b8f295669bbe7338d91d42451a0fdMason Tang
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1661c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for querying an instance range. The begin
1662c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * and end of the range to query should be added as path segments if
1663c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * this is used directly.
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1665c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
1666a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
1667a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                "/instances/when");
1668c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1669c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for querying an instance range by Julian
1670c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Day. The start and end day should be added as path segments if this
1671c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * is used directly.
1672c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
16732cfb0d166b5e8a0e89b2b3d19abe4f76ff38cfabMichael Chan        public static final Uri CONTENT_BY_DAY_URI =
1674a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff            Uri.parse("content://" + AUTHORITY + "/instances/whenbyday");
1675c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1676c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for querying an instance range with a search
1677c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * term. The begin, end, and search string should be appended as path
1678c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * segments if this is used directly.
1679c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
168019f845804c4b8f295669bbe7338d91d42451a0fdMason Tang        public static final Uri CONTENT_SEARCH_URI = Uri.parse("content://" + AUTHORITY +
168119f845804c4b8f295669bbe7338d91d42451a0fdMason Tang                "/instances/search");
1682c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1683c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for querying an instance range with a search
1684c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * term. The start day, end day, and search string should be appended as
1685c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * path segments if this is used directly.
1686c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
168719f845804c4b8f295669bbe7338d91d42451a0fdMason Tang        public static final Uri CONTENT_SEARCH_BY_DAY_URI =
168819f845804c4b8f295669bbe7338d91d42451a0fdMason Tang            Uri.parse("content://" + AUTHORITY + "/instances/searchbyday");
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table.
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1693c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String DEFAULT_SORT_ORDER = "begin ASC";
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1696c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The beginning time of the instance, in UTC milliseconds. Column name.
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String BEGIN = "begin";
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1702c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The ending time of the instance, in UTC milliseconds. Column name.
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String END = "end";
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1708c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The _id of the event for this instance. Column name.
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long, foreign key to the Events table)</P>
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1714c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Julian start day of the instance, relative to the local time
1715c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * zone. Column name.
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String START_DAY = "startDay";
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1721c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Julian end day of the instance, relative to the local time
1722c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * zone. Column name.
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String END_DAY = "endDay";
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The start minute of the instance measured from midnight in the
1729c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * local time zone. Column name.
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String START_MINUTE = "startMinute";
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The end minute of the instance measured from midnight in the
1736c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * local time zone. Column name.
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String END_MINUTE = "endMinute";
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1742b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface CalendarCacheColumns {
174371ad58c751eb12a500916556c41e704a93895801Erik        /**
1744c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The key for the setting. Keys are defined in {@link CalendarCache}.
174571ad58c751eb12a500916556c41e704a93895801Erik         */
174671ad58c751eb12a500916556c41e704a93895801Erik        public static final String KEY = "key";
174771ad58c751eb12a500916556c41e704a93895801Erik
174871ad58c751eb12a500916556c41e704a93895801Erik        /**
174971ad58c751eb12a500916556c41e704a93895801Erik         * The value of the given setting.
175071ad58c751eb12a500916556c41e704a93895801Erik         */
175171ad58c751eb12a500916556c41e704a93895801Erik        public static final String VALUE = "value";
175271ad58c751eb12a500916556c41e704a93895801Erik    }
175371ad58c751eb12a500916556c41e704a93895801Erik
1754083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik    /**
1755083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     * CalendarCache stores some settings for calendar including the current
1756083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     * time zone for the instances. These settings are stored using a key/value
1757083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     * scheme. A {@link #KEY} must be specified when updating these values.
1758083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     */
17593672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    public static final class CalendarCache implements CalendarCacheColumns {
176071ad58c751eb12a500916556c41e704a93895801Erik        /**
176171ad58c751eb12a500916556c41e704a93895801Erik         * The URI to use for retrieving the properties from the Calendar db.
176271ad58c751eb12a500916556c41e704a93895801Erik         */
176371ad58c751eb12a500916556c41e704a93895801Erik        public static final Uri URI =
176471ad58c751eb12a500916556c41e704a93895801Erik                Uri.parse("content://" + AUTHORITY + "/properties");
176571ad58c751eb12a500916556c41e704a93895801Erik
176671ad58c751eb12a500916556c41e704a93895801Erik        /**
17673672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
17683672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
17693672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private CalendarCache() {}
17703672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
17713672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
177271ad58c751eb12a500916556c41e704a93895801Erik         * They key for updating the use of auto/home time zones in Calendar.
177371ad58c751eb12a500916556c41e704a93895801Erik         * Valid values are {@link #TIMEZONE_TYPE_AUTO} or
177471ad58c751eb12a500916556c41e704a93895801Erik         * {@link #TIMEZONE_TYPE_HOME}.
177571ad58c751eb12a500916556c41e704a93895801Erik         */
1776083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final String KEY_TIMEZONE_TYPE = "timezoneType";
177771ad58c751eb12a500916556c41e704a93895801Erik
177871ad58c751eb12a500916556c41e704a93895801Erik        /**
177971ad58c751eb12a500916556c41e704a93895801Erik         * The key for updating the time zone used by the provider when it
178071ad58c751eb12a500916556c41e704a93895801Erik         * generates the instances table. This should only be written if the
178171ad58c751eb12a500916556c41e704a93895801Erik         * type is set to {@link #TIMEZONE_TYPE_HOME}. A valid time zone id
178271ad58c751eb12a500916556c41e704a93895801Erik         * should be written to this field.
178371ad58c751eb12a500916556c41e704a93895801Erik         */
1784083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final String KEY_TIMEZONE_INSTANCES = "timezoneInstances";
178571ad58c751eb12a500916556c41e704a93895801Erik
178671ad58c751eb12a500916556c41e704a93895801Erik        /**
178771ad58c751eb12a500916556c41e704a93895801Erik         * The key for reading the last time zone set by the user. This should
178871ad58c751eb12a500916556c41e704a93895801Erik         * only be read by apps and it will be automatically updated whenever
1789083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * {@link #KEY_TIMEZONE_INSTANCES} is updated with
179071ad58c751eb12a500916556c41e704a93895801Erik         * {@link #TIMEZONE_TYPE_HOME} set.
179171ad58c751eb12a500916556c41e704a93895801Erik         */
1792083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final String KEY_TIMEZONE_INSTANCES_PREVIOUS = "timezoneInstancesPrevious";
179371ad58c751eb12a500916556c41e704a93895801Erik
179471ad58c751eb12a500916556c41e704a93895801Erik        /**
1795083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * The value to write to {@link #KEY_TIMEZONE_TYPE} if the provider
179671ad58c751eb12a500916556c41e704a93895801Erik         * should stay in sync with the device's time zone.
179771ad58c751eb12a500916556c41e704a93895801Erik         */
179871ad58c751eb12a500916556c41e704a93895801Erik        public static final String TIMEZONE_TYPE_AUTO = "auto";
179971ad58c751eb12a500916556c41e704a93895801Erik
180071ad58c751eb12a500916556c41e704a93895801Erik        /**
1801083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * The value to write to {@link #KEY_TIMEZONE_TYPE} if the provider
180271ad58c751eb12a500916556c41e704a93895801Erik         * should use a fixed time zone set by the user.
180371ad58c751eb12a500916556c41e704a93895801Erik         */
180471ad58c751eb12a500916556c41e704a93895801Erik        public static final String TIMEZONE_TYPE_HOME = "home";
180571ad58c751eb12a500916556c41e704a93895801Erik    }
180671ad58c751eb12a500916556c41e704a93895801Erik
180771ad58c751eb12a500916556c41e704a93895801Erik    /**
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A few Calendar globals are needed in the CalendarProvider for expanding
180959dab49cb8350afd1baa77999ec2f91283d78536RoboErik     * the Instances table and these are all stored in the first (and only) row
181059dab49cb8350afd1baa77999ec2f91283d78536RoboErik     * of the CalendarMetaData table.
181159dab49cb8350afd1baa77999ec2f91283d78536RoboErik     *
181259dab49cb8350afd1baa77999ec2f91283d78536RoboErik     * @hide
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1814b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface CalendarMetaDataColumns {
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The local timezone that was used for precomputing the fields
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in the Instances table.
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String LOCAL_TIMEZONE = "localTimezone";
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The minimum time used in expanding the Instances table,
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in UTC milliseconds.
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MIN_INSTANCE = "minInstance";
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum time used in expanding the Instances table,
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in UTC milliseconds.
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MAX_INSTANCE = "maxInstance";
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
18363763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * The minimum Julian day in the EventDays table.
18373763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * <P>Type: INTEGER</P>
18383763464e8f0df4d387ff46803e5a9c76045c85e6Erik         */
18393763464e8f0df4d387ff46803e5a9c76045c85e6Erik        public static final String MIN_EVENTDAYS = "minEventDays";
18403763464e8f0df4d387ff46803e5a9c76045c85e6Erik
18413763464e8f0df4d387ff46803e5a9c76045c85e6Erik        /**
18423763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * The maximum Julian day in the EventDays table.
18433763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * <P>Type: INTEGER</P>
18443763464e8f0df4d387ff46803e5a9c76045c85e6Erik         */
18453763464e8f0df4d387ff46803e5a9c76045c85e6Erik        public static final String MAX_EVENTDAYS = "maxEventDays";
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18475b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
1848c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
1849c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * @hide
1850c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
1851505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    public static final class CalendarMetaData implements CalendarMetaDataColumns, BaseColumns {
18523672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
18533672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
18543672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
18553672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
18563672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private CalendarMetaData() {}
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18583763464e8f0df4d387ff46803e5a9c76045c85e6Erik
1859b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface EventDaysColumns {
18603763464e8f0df4d387ff46803e5a9c76045c85e6Erik        /**
1861c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Julian starting day number. Column name.
18623763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * <P>Type: INTEGER (int)</P>
18633763464e8f0df4d387ff46803e5a9c76045c85e6Erik         */
18643763464e8f0df4d387ff46803e5a9c76045c85e6Erik        public static final String STARTDAY = "startDay";
1865c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1866c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Julian ending day number. Column name.
1867c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (int)</P>
1868c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
1869bd8e2e20a9a1d98f1521ec1f98b6403e73b275d3Erik        public static final String ENDDAY = "endDay";
18703763464e8f0df4d387ff46803e5a9c76045c85e6Erik
18713763464e8f0df4d387ff46803e5a9c76045c85e6Erik    }
18723763464e8f0df4d387ff46803e5a9c76045c85e6Erik
1873c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
1874c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Fields and helpers for querying for a list of days that contain events.
1875c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
18763763464e8f0df4d387ff46803e5a9c76045c85e6Erik    public static final class EventDays implements EventDaysColumns {
1877b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
1878c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                + "/instances/groupbyday");
1879c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String SELECTION = "selected=1";
18803763464e8f0df4d387ff46803e5a9c76045c85e6Erik
18813763464e8f0df4d387ff46803e5a9c76045c85e6Erik        /**
18823672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
18833672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
18843672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private EventDays() {}
18853672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
18863672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
1887c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Retrieves the days with events for the Julian days starting at
1888c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * "startDay" for "numDays". It returns a cursor containing startday and
1889c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * endday representing the max range of days for all events beginning on
1890c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * each startday.This is a blocking function and should not be done on
1891c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * the UI thread.
18923672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         *
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cr the ContentResolver
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param startDay the first Julian day in the range
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param numDays the number of days to load (must be at least 1)
189658644028f909ecb429b26f909bedfb62a153d4e4RoboErik         * @param projection the columns to return in the cursor
1897c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return a database cursor containing a list of start and end days for
1898c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         events
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
190058644028f909ecb429b26f909bedfb62a153d4e4RoboErik        public static final Cursor query(ContentResolver cr, int startDay, int numDays,
190158644028f909ecb429b26f909bedfb62a153d4e4RoboErik                String[] projection) {
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (numDays < 1) {
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int endDay = startDay + numDays - 1;
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri.Builder builder = CONTENT_URI.buildUpon();
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentUris.appendId(builder, startDay);
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentUris.appendId(builder, endDay);
190958644028f909ecb429b26f909bedfb62a153d4e4RoboErik            return cr.query(builder.build(), projection, SELECTION,
19103763464e8f0df4d387ff46803e5a9c76045c85e6Erik                    null /* selection args */, STARTDAY);
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1914b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface RemindersColumns {
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1916c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The event the reminder belongs to. Column name.
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (foreign key to the Events table)</P>
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The minutes prior to the event that the alarm should ring.  -1
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * specifies that we should use the default value for the system.
1924c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Column name.
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MINUTES = "minutes";
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1930c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Passing this as a minutes value will use the default reminder
1931c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * minutes.
1932c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int MINUTES_DEFAULT = -1;
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1936c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The alarm method, as set on the server. {@link #METHOD_DEFAULT},
1937c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * {@link #METHOD_ALERT}, {@link #METHOD_EMAIL}, and {@link #METHOD_SMS}
1938c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * are possible values; the device will only process
1939c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * {@link #METHOD_DEFAULT} and {@link #METHOD_ALERT} reminders (the
1940c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * other types are simply stored so we can send the same reminder info
1941c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * back to the server when we make changes).
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String METHOD = "method";
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int METHOD_DEFAULT = 0;
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int METHOD_ALERT = 1;
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int METHOD_EMAIL = 2;
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int METHOD_SMS = 3;
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1951c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
19523771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * Fields and helpers for accessing reminders for an event. Each row of this
19533771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * table represents a single reminder for an event. Calling
195458644028f909ecb429b26f909bedfb62a153d4e4RoboErik     * {@link #query(ContentResolver, long, String[])} will return a list of reminders for
19553771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * the event with the given eventId. Both apps and sync adapters may write
19563771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * to this table. There are three writable fields and all of them must be
19573771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * included when inserting a new reminder. They are:
19583771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <ul>
19593771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #EVENT_ID}</li>
19603771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #MINUTES}</li>
19613771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #METHOD}</li>
19623771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * </ul>
1963c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class Reminders implements BaseColumns, RemindersColumns, EventsColumns {
1965bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik        private static final String REMINDERS_WHERE = CalendarContract.Reminders.EVENT_ID + "=?";
1966c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
1967a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/reminders");
1968c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik
1969c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
19703672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
19713672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
19723672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Reminders() {}
19733672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
19743672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
1975c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Queries all reminders associated with the given event. This is a
1976c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * blocking call and should not be done on the UI thread.
19773672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         *
1978c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cr The content resolver to use for the query
1979c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param eventId The id of the event to retrieve reminders for
198058644028f909ecb429b26f909bedfb62a153d4e4RoboErik         * @param projection the columns to return in the cursor
1981c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return A Cursor containing all reminders for the event
1982c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
198358644028f909ecb429b26f909bedfb62a153d4e4RoboErik        public static final Cursor query(ContentResolver cr, long eventId, String[] projection) {
1984c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            String[] remArgs = {Long.toString(eventId)};
198558644028f909ecb429b26f909bedfb62a153d4e4RoboErik            return cr.query(CONTENT_URI, projection, REMINDERS_WHERE, remArgs /*selection args*/,
1986c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                    null /* sort order */);
1987c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        }
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1990b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface CalendarAlertsColumns {
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1992c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The event that the alert belongs to. Column name.
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (foreign key to the Events table)</P>
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1998c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The start time of the event, in UTC. Column name.
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String BEGIN = "begin";
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2004c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The end time of the event, in UTC. Column name.
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String END = "end";
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2010c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The alarm time of the event, in UTC. Column name.
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ALARM_TIME = "alarmTime";
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The creation time of this database entry, in UTC.
2017c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Useful for debugging missed reminders. Column name.
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CREATION_TIME = "creationTime";
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The time that the alarm broadcast was received by the Calendar app,
2024c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * in UTC. Useful for debugging missed reminders. Column name.
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String RECEIVED_TIME = "receivedTime";
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The time that the notification was created by the Calendar app,
2031c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * in UTC. Useful for debugging missed reminders. Column name.
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NOTIFY_TIME = "notifyTime";
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2037083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * The state of this alert. It starts out as {@link #STATE_SCHEDULED}, then
2038083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * when the alarm goes off, it changes to {@link #STATE_FIRED}, and then when
2039083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * the user dismisses the alarm it changes to {@link #STATE_DISMISSED}. Column
2040c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * name.
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String STATE = "state";
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2045083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        /**
2046083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * An alert begins in this state when it is first created.
2047083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         */
2048083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final int STATE_SCHEDULED = 0;
2049083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        /**
2050083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * After a notification for an alert has been created it should be
2051083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * updated to fired.
2052083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         */
2053083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final int STATE_FIRED = 1;
2054083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        /**
2055083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * Once the user has dismissed the notification the alert's state should
2056083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * be set to dismissed so it is not fired again.
2057083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         */
2058083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final int STATE_DISMISSED = 2;
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2061c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The number of minutes that this alarm precedes the start time. Column
2062c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * name.
2063c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER</P>
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MINUTES = "minutes";
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2068c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The default sort order for this alerts queries
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2070cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan        public static final String DEFAULT_SORT_ORDER = "begin ASC,title ASC";
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2073c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
2074c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Fields and helpers for accessing calendar alerts information. These
20753771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * fields are for tracking which alerts have been fired. Scheduled alarms
2076e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik     * will generate an intent using {@link #ACTION_EVENT_REMINDER}. Apps that
20773771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * receive this action may update the {@link #STATE} for the reminder when
20783771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * they have finished handling it. Apps that have their notifications
20793771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * disabled should not modify the table to ensure that they do not conflict
20803771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * with another app that is generating a notification. In general, apps
20813771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * should not need to write to this table directly except to update the
20823771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * state of a reminder.
2083c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class CalendarAlerts implements BaseColumns,
2085e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            CalendarAlertsColumns, EventsColumns, CalendarColumns {
20861dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
2087c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
2088c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @hide
2089c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String TABLE_NAME = "CalendarAlerts";
2091c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
2092c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Uri for querying calendar alert information
2093c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
2094c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
2095a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
2096a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                "/calendar_alerts");
20975b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
20983672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
20993672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
21003672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
21013672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private CalendarAlerts() {}
21023672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
21031dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        private static final String WHERE_ALARM_EXISTS = EVENT_ID + "=?"
21041dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + BEGIN + "=?"
21051dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + ALARM_TIME + "=?";
21061dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
21071dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        private static final String WHERE_FINDNEXTALARMTIME = ALARM_TIME + ">=?";
21081dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        private static final String SORT_ORDER_ALARMTIME_ASC = ALARM_TIME + " ASC";
21091dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
2110083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        private static final String WHERE_RESCHEDULE_MISSED_ALARMS = STATE + "=" + STATE_SCHEDULED
21111dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + ALARM_TIME + "<?"
21121dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + ALARM_TIME + ">?"
21131dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + END + ">=?";
21141dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This URI is for grouping the query results by event_id and begin
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * time.  This will return one result per instance of an event.  So
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * events with multiple alarms will appear just once, but multiple
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * instances of a repeating event will show up multiple times.
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21215b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff        public static final Uri CONTENT_URI_BY_INSTANCE =
2122a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff            Uri.parse("content://" + AUTHORITY + "/calendar_alerts/by_instance");
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2124083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        private static final boolean DEBUG = false;
2125cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2126c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
2127083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * Helper for inserting an alarm time associated with an event TODO move
2128083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * to Provider
2129c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
2130c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @hide
2131c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri insert(ContentResolver cr, long eventId,
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long begin, long end, long alarmTime, int minutes) {
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentValues values = new ContentValues();
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.EVENT_ID, eventId);
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.BEGIN, begin);
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.END, end);
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.ALARM_TIME, alarmTime);
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long currentTime = System.currentTimeMillis();
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.CREATION_TIME, currentTime);
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.RECEIVED_TIME, 0);
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.NOTIFY_TIME, 0);
2143083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik            values.put(CalendarAlerts.STATE, STATE_SCHEDULED);
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.MINUTES, minutes);
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cr.insert(CONTENT_URI, values);
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2148c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Finds the next alarm after (or equal to) the given time and returns
2150c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * the time of that alarm or -1 if no such alarm exists. This is a
2151083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * blocking call and should not be done on the UI thread. TODO move to
2152083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * provider
21535b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff         *
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cr the ContentResolver
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param millis the time in UTC milliseconds
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return the next alarm time greater than or equal to "millis", or -1
2157c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         if no such alarm exists.
2158083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final long findNextAlarmTime(ContentResolver cr, long millis) {
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String selection = ALARM_TIME + ">=" + millis;
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: construct an explicit SQL query so that we can add
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // "LIMIT 1" to the end and get just one result.
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] projection = new String[] { ALARM_TIME };
2165083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik            Cursor cursor = cr.query(CONTENT_URI, projection, WHERE_FINDNEXTALARMTIME,
2166083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    (new String[] {
21671dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                        Long.toString(millis)
2168083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    }), SORT_ORDER_ALARMTIME_ASC);
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long alarmTime = -1;
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cursor != null && cursor.moveToFirst()) {
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    alarmTime = cursor.getLong(0);
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cursor != null) {
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cursor.close();
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return alarmTime;
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21815b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Searches the CalendarAlerts table for alarms that should have fired
2184083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * but have not and then reschedules them. This method can be called at
2185083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * boot time to restore alarms that may have been lost due to a phone
2186083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * reboot. TODO move to provider
21875b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff         *
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cr the ContentResolver
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param context the Context
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param manager the AlarmManager
2191083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final void rescheduleMissedAlarms(ContentResolver cr,
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Context context, AlarmManager manager) {
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Get all the alerts that have been scheduled but have not fired
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // and should have fired by now and are not too old.
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long now = System.currentTimeMillis();
2198cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            long ancient = now - DateUtils.DAY_IN_MILLIS;
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] projection = new String[] {
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ALARM_TIME,
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
2202cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2203cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            // TODO: construct an explicit SQL query so that we can add
2204cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            // "GROUPBY" instead of doing a sort and de-dup
2205083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik            Cursor cursor = cr.query(CalendarAlerts.CONTENT_URI, projection,
2206083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    WHERE_RESCHEDULE_MISSED_ALARMS, (new String[] {
2207083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                            Long.toString(now), Long.toString(ancient), Long.toString(now)
2208083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    }), SORT_ORDER_ALARMTIME_ASC);
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cursor == null) {
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2212cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2213cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            if (DEBUG) {
2214105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                Log.d(TAG, "missed alarms found: " + cursor.getCount());
2215105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
22165b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
2218cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                long alarmTime = -1;
2219cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (cursor.moveToNext()) {
2221cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                    long newAlarmTime = cursor.getLong(0);
2222cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                    if (alarmTime != newAlarmTime) {
2223cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                        if (DEBUG) {
2224cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                            Log.w(TAG, "rescheduling missed alarm. alarmTime: " + newAlarmTime);
2225cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                        }
2226cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                        scheduleAlarm(context, manager, newAlarmTime);
2227cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                        alarmTime = newAlarmTime;
2228cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                    }
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cursor.close();
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2233cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan        }
2234cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2235c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
2236c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Schedules an alarm intent with the system AlarmManager that will
22373771fcbc192386d96b57d1edec44d53620d9f09dRoboErik         * notify listeners when a reminder should be fired. The provider will
22383771fcbc192386d96b57d1edec44d53620d9f09dRoboErik         * keep scheduled reminders up to date but apps may use this to
22393771fcbc192386d96b57d1edec44d53620d9f09dRoboErik         * implement snooze functionality without modifying the reminders table.
22403771fcbc192386d96b57d1edec44d53620d9f09dRoboErik         * Scheduled alarms will generate an intent using
2241083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * {@link #ACTION_EVENT_REMINDER}. TODO Move to provider
2242c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
2243c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param context A context for referencing system resources
2244c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param manager The AlarmManager to use or null
2245c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param alarmTime The time to fire the intent in UTC millis since
2246c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
2247083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
2248c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
2249cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan        public static void scheduleAlarm(Context context, AlarmManager manager, long alarmTime) {
2250cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            if (DEBUG) {
2251cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                Time time = new Time();
2252cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                time.set(alarmTime);
2253cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                String schedTime = time.format(" %a, %b %d, %Y %I:%M%P");
2254cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                Log.d(TAG, "Schedule alarm at " + alarmTime + " " + schedTime);
2255cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            }
2256cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2257cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            if (manager == null) {
2258cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
2259cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            }
22605b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
2261e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            Intent intent = new Intent(ACTION_EVENT_REMINDER);
2262bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik            intent.setData(ContentUris.withAppendedId(CalendarContract.CONTENT_URI, alarmTime));
22631dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio            intent.putExtra(ALARM_TIME, alarmTime);
226442f1957817c3bda0c002e2c987f2a8bbe320f755Erik            PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
2265cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            manager.set(AlarmManager.RTC_WAKEUP, alarmTime, pi);
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22675b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2269083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * Searches for an entry in the CalendarAlerts table that matches the
2270083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * given event id, begin time and alarm time. If one is found then this
2271083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * alarm already exists and this method returns true. TODO Move to
2272083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * provider
227358644028f909ecb429b26f909bedfb62a153d4e4RoboErik         *
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cr the ContentResolver
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param eventId the event id to match
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param begin the start time of the event in UTC millis
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param alarmTime the alarm time of the event in UTC millis
2278083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @return true if there is already an alarm for the given event with
2279083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         *         the same start time and alarm time.
2280083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final boolean alarmExists(ContentResolver cr, long eventId,
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long begin, long alarmTime) {
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: construct an explicit SQL query so that we can add
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // "LIMIT 1" to the end and get just one result.
22861dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio            String[] projection = new String[] { ALARM_TIME };
2287083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik            Cursor cursor = cr.query(CONTENT_URI, projection, WHERE_ALARM_EXISTS,
2288083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    (new String[] {
2289083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                            Long.toString(eventId), Long.toString(begin), Long.toString(alarmTime)
2290083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    }), null);
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean found = false;
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cursor != null && cursor.getCount() > 0) {
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    found = true;
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cursor != null) {
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cursor.close();
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return found;
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2305f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik    /**
2306f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     * @hide
2307f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     * TODO UNHIDE
2308f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     */
2309f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik    protected interface ColorsColumns extends SyncStateContract.Columns {
2310f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2311f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2312f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * The type of color, which describes how it should be used. Valid types
2313f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * are {@link #TYPE_CALENDAR} and {@link #TYPE_EVENT}. Column name.
2314f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>
2315f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * Type: INTEGER (NOT NULL)
2316f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * </P>
2317f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2318f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final String COLOR_TYPE = "color_type";
2319f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2320f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2321f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * This indicateds a color that can be used for calendars.
2322f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2323f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final int TYPE_CALENDAR = 0;
2324f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2325f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * This indicates a color that can be used for events.
2326f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2327f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final int TYPE_EVENT = 1;
2328f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2329f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2330f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * The index used to reference this color. This can be any non-empty
2331f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * string, but must be unique for a given {@link #ACCOUNT_TYPE} and
2332f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link #ACCOUNT_NAME} . Column name.
2333f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>
2334f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * Type: TEXT
2335f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * </P>
2336f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2337f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final String COLOR_INDEX = "color_index";
2338f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2339f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
234005b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik         * The color as an 8-bit ARGB integer value. Colors should specify alpha
234105b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik         * as fully opaque (eg 0xFF993322) as the alpha may be ignored or
234205b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik         * modified for display. It is reccomended that colors be usable with
234305b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik         * light (near white) text. Apps should not depend on that assumption,
234405b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik         * however. Column name.
2345f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>
2346f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * Type: INTEGER (NOT NULL)
2347f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * </P>
2348f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
234905b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik        public static final String COLOR = "color";
2350f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2351f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik    }
2352f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2353f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik    /**
2354f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     * Fields for accessing colors available for a given account. Colors are
2355f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     * referenced by {@link #COLOR_INDEX} which must be unique for a given
2356f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     * account name/type. These values should only be updated by the sync
2357f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     * adapter.
2358f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     * TODO UNHIDE
2359f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     *
2360f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     * @hide
2361f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     */
2362f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik    public static final class Colors implements ColorsColumns {
2363f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2364f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * @hide
2365f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2366f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final String TABLE_NAME = "Colors";
2367f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2368f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * The Uri for querying color information
2369f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2370f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        @SuppressWarnings("hiding")
2371f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/colors");
2372f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2373f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2374f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * This utility class cannot be instantiated
2375f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2376f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        private Colors() {
2377f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        }
2378f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik    }
2379f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2380b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface ExtendedPropertiesColumns {
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2382c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The event the extended property belongs to. Column name.
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (foreign key to the Events table)</P>
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The name of the extended property.  This is a uri of the form
2389c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * {scheme}#{local-name} convention. Column name.
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NAME = "name";
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2395c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The value of the extended property. Column name.
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String VALUE = "value";
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2401c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
2402c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Fields for accessing the Extended Properties. This is a generic set of
2403c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * name/value pairs for use by sync adapters or apps to add extra
24043771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * information to events. There are three writable columns and all three
24053771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * must be present when inserting a new value. They are:
24063771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <ul>
24073771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #EVENT_ID}</li>
24083771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #NAME}</li>
24093771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #VALUE}</li>
24103771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * </ul>
2411c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   public static final class ExtendedProperties implements BaseColumns,
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ExtendedPropertiesColumns, EventsColumns {
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri CONTENT_URI =
2415a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                Uri.parse("content://" + AUTHORITY + "/extendedproperties");
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24173672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
24183672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
24193672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
24203672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private ExtendedProperties() {}
24213672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: fill out this class when we actually start utilizing extendedproperties
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // in the calendar application.
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   }
2425ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff
2426ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff    /**
2427ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff     * A table provided for sync adapters to use for storing private sync state data.
2428ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff     *
2429ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff     * @see SyncStateContract
2430ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff     */
2431ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff    public static final class SyncState implements SyncStateContract.Columns {
2432ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff        /**
2433ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff         * This utility class cannot be instantiated
2434ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff         */
2435ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff        private SyncState() {}
2436ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff
2437c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String CONTENT_DIRECTORY =
2438ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff                SyncStateContract.Constants.CONTENT_DIRECTORY;
2439ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff
2440ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff        /**
2441ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff         * The content:// style URI for this table
2442ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff         */
2443ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff        public static final Uri CONTENT_URI =
2444bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik                Uri.withAppendedPath(CalendarContract.CONTENT_URI, CONTENT_DIRECTORY);
2445ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff    }
2446505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2447505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    /**
2448505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio     * Columns from the EventsRawTimes table
24493771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     *
24503771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * @hide
2451505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio     */
2452b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface EventsRawTimesColumns {
2453505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2454c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The corresponding event id. Column name.
2455505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: INTEGER (long)</P>
2456505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2457505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String EVENT_ID = "event_id";
2458505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2459505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2460c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The RFC2445 compliant time the event starts. Column name.
2461505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: TEXT</P>
2462505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2463505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String DTSTART_2445 = "dtstart2445";
2464505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2465505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2466c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The RFC2445 compliant time the event ends. Column name.
2467505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: TEXT</P>
2468505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2469505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String DTEND_2445 = "dtend2445";
2470505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2471505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2472c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The RFC2445 compliant original instance time of the recurring event
2473c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * for which this event is an exception. Column name.
2474505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: TEXT</P>
2475505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2476505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String ORIGINAL_INSTANCE_TIME_2445 = "originalInstanceTime2445";
2477505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2478505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2479c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The RFC2445 compliant last date this event repeats on, or NULL if it
2480c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * never ends. Column name.
2481505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: TEXT</P>
2482505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2483505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String LAST_DATE_2445 = "lastDate2445";
2484505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    }
2485505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2486c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
2487c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * @hide
2488c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
2489505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    public static final class EventsRawTimes implements BaseColumns, EventsRawTimesColumns {
24903672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
24913672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
24923672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
24933672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
24943672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private EventsRawTimes() {}
2495505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    }
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2497