CalendarContract.java revision bd2516165e4d38f1ee7f7f0ceb038ebf7ea1b84a
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>
7573bddfcdd3ba50d30aca9df0f394d15bc7932b6aMichael Chan * <li>The {@link ExtendedProperties} table holds 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        /**
3034172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * A key for looking up a color from the {@link Colors} table. NULL or
3044172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * an empty string are reserved for indicating that the calendar does
3054172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * not use a key for looking up the color. The provider will update
3064172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * {@link #CALENDAR_COLOR} automatically when a valid key is written to
3074172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * this column. The key must reference an existing row of the
3088a8eebcbe8e3aded682c9c4937e155218ddf7ff4RoboErik         * {@link Colors} table. @see Colors
309f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>
310f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * Type: TEXT
311f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * </P>
312f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
3134172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik        public static final String CALENDAR_COLOR_KEY = "calendar_color_index";
314f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
315f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
3169734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * The display name of the calendar. Column name.
317f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>
318f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * Type: TEXT
319f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * </P>
3209734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
3219734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CALENDAR_DISPLAY_NAME = "calendar_displayName";
3229734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
3239734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
324c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * The level of access that the user has for the calendar
325c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: INTEGER (one of the values below)</P>
326c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
3279734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CALENDAR_ACCESS_LEVEL = "calendar_access_level";
328c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
329c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Cannot access the calendar */
3309734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_NONE = 0;
331c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Can only see free/busy information about the calendar */
3329734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_FREEBUSY = 100;
333c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Can read all event details */
3349734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_READ = 200;
335c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /** Can reply yes/no/maybe to an event */
3369734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_RESPOND = 300;
337c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /** not used */
3389734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_OVERRIDE = 400;
339c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /** Full access to modify the calendar, but not the access control
340c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * settings
341c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
3429734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_CONTRIBUTOR = 500;
343c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /** Full access to modify the calendar, but not the access control
344c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * settings
345c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
3469734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_EDITOR = 600;
347c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Full access to the calendar */
3489734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_OWNER = 700;
349c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Domain admin */
3509734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_ROOT = 800;
351c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
352c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
353c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * Is the calendar selected to be displayed?
354c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * 0 - do not show events associated with this calendar.
355c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * 1 - show events associated with this calendar
356c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: INTEGER (boolean)</P>
357c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
358df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden        public static final String VISIBLE = "visible";
359c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
360c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
361c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The time zone the calendar is associated with.
362c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: TEXT</P>
363c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
3649734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CALENDAR_TIME_ZONE = "calendar_timezone";
365c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
366c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
367c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Is this calendar synced and are its events stored on the device?
368c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * 0 - Do not sync this calendar or store events for this calendar.
369c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * 1 - Sync down events for this calendar.
370c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <p>Type: INTEGER (boolean)</p>
371c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
372c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        public static final String SYNC_EVENTS = "sync_events";
373c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
374c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
3759734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * The owner account for this calendar, based on the calendar feed.
3769734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This will be different from the _SYNC_ACCOUNT for delegated calendars.
3779734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Column name.
3789734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: String</P>
379c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
3809734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String OWNER_ACCOUNT = "ownerAccount";
381c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
382c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
3839734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Can the organizer respond to the event?  If no, the status of the
3849734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * organizer should not be shown by the UI.  Defaults to 1. Column name.
385c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: INTEGER (boolean)</P>
386c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
3879734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAN_ORGANIZER_RESPOND = "canOrganizerRespond";
3889734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
3899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
3909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Can the organizer modify the time zone of the event? Column name.
3919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: INTEGER (boolean)</P>
3929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        */
3939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAN_MODIFY_TIME_ZONE = "canModifyTimeZone";
3949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
3959734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
3969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * The maximum number of reminders allowed for an event. Column name.
3979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: INTEGER</P>
3989734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
3999734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String MAX_REMINDERS = "maxReminders";
4009734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
4019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
4029734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * A comma separated list of reminder methods supported for this
4039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * calendar in the format "#,#,#". Valid types are
4049734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * {@link Reminders#METHOD_DEFAULT}, {@link Reminders#METHOD_ALERT},
405bd2516165e4d38f1ee7f7f0ceb038ebf7ea1b84aAlon Albert         * {@link Reminders#METHOD_EMAIL}, {@link Reminders#METHOD_SMS},
406bd2516165e4d38f1ee7f7f0ceb038ebf7ea1b84aAlon Albert         * {@link Reminders#METHOD_ALARM}. Column name.
4079734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
4089734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
4099734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String ALLOWED_REMINDERS = "allowedReminders";
410f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
411f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
412f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * A comma separated list of availability types supported for this
413f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * calendar in the format "#,#,#". Valid types are
414f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link Events#AVAILABILITY_BUSY}, {@link Events#AVAILABILITY_FREE},
415f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link Events#AVAILABILITY_TENTATIVE}. Setting this field to only
416f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link Events#AVAILABILITY_BUSY} should be used to indicate that
417f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * changing the availability is not supported.
418f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         *
419f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
420f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final String ALLOWED_AVAILABILITY = "allowedAvailability";
421f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
422f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
423f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * A comma separated list of attendee types supported for this calendar
424f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * in the format "#,#,#". Valid types are {@link Attendees#TYPE_NONE},
425f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link Attendees#TYPE_OPTIONAL}, {@link Attendees#TYPE_REQUIRED},
426f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link Attendees#TYPE_RESOURCE}. Setting this field to only
427f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * {@link Attendees#TYPE_NONE} should be used to indicate that changing
428f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * the attendee type is not supported.
429f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         *
430f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
431f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final String ALLOWED_ATTENDEE_TYPES = "allowedAttendeeTypes";
432c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    }
433c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
434c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    /**
435c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     * Class that represents a Calendar Entity. There is one entry per calendar.
436c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * This is a helper class to make batch operations easier.
437c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     */
4383672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    public static final class CalendarEntity implements BaseColumns, SyncColumns, CalendarColumns {
439c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
440c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
441c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The default Uri used when creating a new calendar EntityIterator.
442c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
443c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
444c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
445c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                "/calendar_entities");
446c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
447c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
4483672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
4493672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
4503672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private CalendarEntity() {}
4513672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
4523672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
453c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Creates an entity iterator for the given cursor. It assumes the
454c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * cursor contains a calendars query.
455c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
456c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cursor query on {@link #CONTENT_URI}
457c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return an EntityIterator of calendars
458c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
459c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        public static EntityIterator newEntityIterator(Cursor cursor) {
460c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            return new EntityIteratorImpl(cursor);
461c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        }
462c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
463c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        private static class EntityIteratorImpl extends CursorEntityIterator {
464c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
465c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            public EntityIteratorImpl(Cursor cursor) {
466c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                super(cursor);
467c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio            }
468c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
469c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio            @Override
470c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio            public Entity getEntityAndIncrementCursor(Cursor cursor) throws RemoteException {
471c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // we expect the cursor is already at the row we need to read from
472c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                final long calendarId = cursor.getLong(cursor.getColumnIndexOrThrow(_ID));
473c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
474c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // Create the content value
475c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                ContentValues cv = new ContentValues();
476c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                cv.put(_ID, calendarId);
477c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
478651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ACCOUNT_NAME);
479651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ACCOUNT_TYPE);
480c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
481c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_ID);
482651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DIRTY);
483c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
4849734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC1);
4859734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC2);
4869734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC3);
4879734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC4);
4889734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC5);
4899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC6);
4909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC7);
4919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC8);
4929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC9);
4939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC10);
494c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
495c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, Calendars.NAME);
496c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
4979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                        Calendars.CALENDAR_DISPLAY_NAME);
498866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
499866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                        Calendars.CALENDAR_COLOR);
5009734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, CALENDAR_ACCESS_LEVEL);
501df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, VISIBLE);
502c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, SYNC_EVENTS);
503651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
504651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                        Calendars.CALENDAR_LOCATION);
5059734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CALENDAR_TIME_ZONE);
506c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
507c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                        Calendars.OWNER_ACCOUNT);
508c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
509df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                        Calendars.CAN_ORGANIZER_RESPOND);
510df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
511df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                        Calendars.CAN_MODIFY_TIME_ZONE);
512df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
513df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                        Calendars.MAX_REMINDERS);
514866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
515866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                        Calendars.CAN_PARTIALLY_UPDATE);
5169734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
5179734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                        Calendars.ALLOWED_REMINDERS);
518c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
519c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, DELETED);
520c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
521c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // Create the Entity from the ContentValue
522c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                Entity entity = new Entity(cv);
523c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
524c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // Set cursor to next row
525c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                cursor.moveToNext();
526c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
527c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // Return the created Entity
528c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                return entity;
529c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio            }
530c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        }
531c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     }
532c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
533c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    /**
534f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * Constants and helpers for the Calendars table, which contains details for
535f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * individual calendars. <h3>Operations</h3> All operations can be done
536f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * either as an app or as a sync adapter. To perform an operation as a sync
537f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * adapter {@link #CALLER_IS_SYNCADAPTER} should be set to true and
538f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #ACCOUNT_NAME} and {@link #ACCOUNT_TYPE} must be set in the Uri
539f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * parameters. See
540f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link Uri.Builder#appendQueryParameter(java.lang.String, java.lang.String)}
541f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * for details on adding parameters. Sync adapters have write access to more
542f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * columns but are restricted to a single account at a time. Calendars are
543f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * designed to be primarily managed by a sync adapter and inserting new
544f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * calendars should be done as a sync adapter. For the most part, apps
545f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * should only update calendars (such as changing the color or display
546f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * name). If a local calendar is required an app can do so by inserting as a
547f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * sync adapter and using an {@link #ACCOUNT_TYPE} of
548f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #ACCOUNT_TYPE_LOCAL} .
549f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dl>
550f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dt><b>Insert</b></dt>
551f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>When inserting a new calendar the following fields must be included:
552f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <ul>
553f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ACCOUNT_NAME}</li>
554f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ACCOUNT_TYPE}</li>
555f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #NAME}</li>
556f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_DISPLAY_NAME}</li>
557f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_COLOR}</li>
558f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_ACCESS_LEVEL}</li>
559f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #OWNER_ACCOUNT}</li>
560f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </ul>
561f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * The following fields are not required when inserting a Calendar but are
562f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * generally a good idea to include:
563f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <ul>
564f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #SYNC_EVENTS} set to 1</li>
565f92ccfb8b0e2062e5170ea649cdc01692b09a683RoboErik     * <li>{@link #CALENDAR_TIME_ZONE}</li>
566f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ALLOWED_REMINDERS}</li>
5674172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik     * <li>{@link #ALLOWED_AVAILABILITY}</li>
5684172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik     * <li>{@link #ALLOWED_ATTENDEE_TYPES}</li>
569f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </ul>
570f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dt><b>Update</b></dt>
571f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>To perform an update on a calendar the {@link #_ID} of the calendar
572f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * should be provided either as an appended id to the Uri (
573f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link ContentUris#withAppendedId}) or as the first selection item--the
574f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * selection should start with "_id=?" and the first selectionArg should be
575f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * the _id of the calendar. Calendars may also be updated using a selection
576f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * without the id. In general, the {@link #ACCOUNT_NAME} and
577f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #ACCOUNT_TYPE} should not be changed after a calendar is created
578f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * as this can cause issues for sync adapters.
579f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dt><b>Delete</b></dt>
580f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>Calendars can be deleted either by the {@link #_ID} as an appended id
581f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * on the Uri or using any standard selection. Deleting a calendar should
582f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * generally be handled by a sync adapter as it will remove the calendar
583f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * from the database and all associated data (aka events).</dd>
584f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dt><b>Query</b></dt>
585f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>Querying the Calendars table will get you all information about a set
586f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * of calendars. There will be one row returned for each calendar that
587f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * matches the query selection, or at most a single row if the {@link #_ID}
588f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * is appended to the Uri.</dd>
589f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </dl>
590f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <h3>Calendar Columns</h3> The following Calendar columns are writable by
591f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * both an app and a sync adapter.
592f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <ul>
593f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #NAME}</li>
594f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_DISPLAY_NAME}</li>
595f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #VISIBLE}</li>
596f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #SYNC_EVENTS}</li>
597f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </ul>
598f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * The following Calendars columns are writable only by a sync adapter
599f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <ul>
600f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ACCOUNT_NAME}</li>
601f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ACCOUNT_TYPE}</li>
6024f52061b51325d8de189eb2cb1c1272b2740b8f8RoboErik     * <li>{@link #CALENDAR_COLOR}</li>
603f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #_SYNC_ID}</li>
604f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #DIRTY}</li>
605f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #OWNER_ACCOUNT}</li>
606f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #MAX_REMINDERS}</li>
607f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ALLOWED_REMINDERS}</li>
6084172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik     * <li>{@link #ALLOWED_AVAILABILITY}</li>
6094172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik     * <li>{@link #ALLOWED_ATTENDEE_TYPES}</li>
610f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAN_MODIFY_TIME_ZONE}</li>
611f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAN_ORGANIZER_RESPOND}</li>
612f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAN_PARTIALLY_UPDATE}</li>
613f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_LOCATION}</li>
614f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_TIME_ZONE}</li>
615f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_ACCESS_LEVEL}</li>
616f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #DELETED}</li>
617f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC1}</li>
618f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC2}</li>
619f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC3}</li>
620f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC4}</li>
621f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC5}</li>
622f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC6}</li>
623f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC7}</li>
624f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC8}</li>
625f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC9}</li>
626f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC10}</li>
627f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </ul>
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6293672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    public static final class Calendars implements BaseColumns, SyncColumns, CalendarColumns {
6303672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
6313672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
6323672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
6333672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
6343672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Calendars() {}
6353672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
637c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for accessing Calendars
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
639c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
6401dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/calendars");
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
645e5e0250dd23d0ff718a26350f3076884235b8c0eMichael Chan        public static final String DEFAULT_SORT_ORDER = CALENDAR_DISPLAY_NAME;
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
648c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The name of the calendar. Column name.
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NAME = "name";
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
654c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The default location for the calendar. Column name.
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
657651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String CALENDAR_LOCATION = "calendar_location";
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6606efb30f40a19a9639076b08df4f64d335c8946a0RoboErik         * These fields are only writable by a sync adapter. To modify them the
661c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * caller must include {@link #CALLER_IS_SYNCADAPTER},
6629734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * {@link #ACCOUNT_NAME}, and {@link #ACCOUNT_TYPE} in the Uri's query
663083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * parameters. TODO move to provider
664083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         *
665083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
6666efb30f40a19a9639076b08df4f64d335c8946a0RoboErik         */
6676efb30f40a19a9639076b08df4f64d335c8946a0RoboErik        public static final String[] SYNC_WRITABLE_COLUMNS = new String[] {
668651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            ACCOUNT_NAME,
669651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            ACCOUNT_TYPE,
6706efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            _SYNC_ID,
671651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            DIRTY,
6726efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            OWNER_ACCOUNT,
6736efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            MAX_REMINDERS,
674f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik            ALLOWED_REMINDERS,
6756efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            CAN_MODIFY_TIME_ZONE,
6766efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            CAN_ORGANIZER_RESPOND,
677866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert            CAN_PARTIALLY_UPDATE,
678651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            CALENDAR_LOCATION,
6799734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CALENDAR_TIME_ZONE,
6809734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CALENDAR_ACCESS_LEVEL,
6816efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            DELETED,
682be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik            CAL_SYNC1,
683be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik            CAL_SYNC2,
684be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik            CAL_SYNC3,
685be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik            CAL_SYNC4,
686c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            CAL_SYNC5,
687c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            CAL_SYNC6,
6889734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CAL_SYNC7,
6899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CAL_SYNC8,
6909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CAL_SYNC9,
6919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CAL_SYNC10,
6926efb30f40a19a9639076b08df4f64d335c8946a0RoboErik        };
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
695c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    /**
696c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     * Columns from the Attendees table that other tables join into themselves.
697c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     */
698b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface AttendeesColumns {
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
701c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The id of the event. Column name.
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
707c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The name of the attendee. Column name.
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: STRING</P>
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_NAME = "attendeeName";
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
713c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The email address of the attendee. Column name.
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: STRING</P>
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_EMAIL = "attendeeEmail";
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
719c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The relationship of the attendee to the user. Column name.
720c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (one of {@link #RELATIONSHIP_ATTENDEE}, ...}.</P>
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_RELATIONSHIP = "attendeeRelationship";
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_NONE = 0;
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_ATTENDEE = 1;
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_ORGANIZER = 2;
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_PERFORMER = 3;
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_SPEAKER = 4;
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
731c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The type of attendee. Column name.
732f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>
7334172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * Type: Integer (one of {@link #TYPE_NONE}, {@link #TYPE_REQUIRED},
7344172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * {@link #TYPE_OPTIONAL}, {@link #TYPE_RESOURCE})
735f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * </P>
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_TYPE = "attendeeType";
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TYPE_NONE = 0;
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TYPE_REQUIRED = 1;
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TYPE_OPTIONAL = 2;
742f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
7434172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * This specifies that an attendee is a resource, like a room, a
7444172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * cabbage, or something and not an actual person.
745f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
746f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final int TYPE_RESOURCE = 3;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
749c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The attendance status of the attendee. Column name.
750c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: Integer (one of {@link #ATTENDEE_STATUS_ACCEPTED}, ...).</P>
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_STATUS = "attendeeStatus";
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_NONE = 0;
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_ACCEPTED = 1;
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_DECLINED = 2;
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_INVITED = 3;
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_TENTATIVE = 4;
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
761c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
7623771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * Fields and helpers for interacting with Attendees. Each row of this table
7633771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * represents a single attendee or guest of an event. Calling
76458644028f909ecb429b26f909bedfb62a153d4e4RoboErik     * {@link #query(ContentResolver, long, String[])} will return a list of attendees for
7653771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * the event with the given eventId. Both apps and sync adapters may write
7663771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * to this table. There are six writable fields and all of them except
7673771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * {@link #ATTENDEE_NAME} must be included when inserting a new attendee.
7683771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * They are:
7693771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <ul>
7703771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #EVENT_ID}</li>
7713771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_NAME}</li>
7723771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_EMAIL}</li>
7733771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_RELATIONSHIP}</li>
7743771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_TYPE}</li>
7753771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_STATUS}</li>
7763771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * </ul>
777c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
7781dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio    public static final class Attendees implements BaseColumns, AttendeesColumns, EventsColumns {
779c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik
780c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
781c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for accessing Attendees data
782c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
783c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
7841dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/attendees");
785c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=?";
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
787c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
7883672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
7893672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
7903672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Attendees() {}
7913672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
7923672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
793c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Queries all attendees associated with the given event. This is a
794c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * blocking call and should not be done on the UI thread.
7953672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         *
796c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cr The content resolver to use for the query
797c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param eventId The id of the event to retrieve attendees for
79858644028f909ecb429b26f909bedfb62a153d4e4RoboErik         * @param projection the columns to return in the cursor
799c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return A Cursor containing all attendees for the event
800c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
80158644028f909ecb429b26f909bedfb62a153d4e4RoboErik        public static final Cursor query(ContentResolver cr, long eventId, String[] projection) {
802c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            String[] attArgs = {Long.toString(eventId)};
80358644028f909ecb429b26f909bedfb62a153d4e4RoboErik            return cr.query(CONTENT_URI, projection, ATTENDEES_WHERE, attArgs /* selection args */,
804c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                    null /* sort order */);
805c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        }
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Columns from the Events table that other tables join into themselves.
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
811b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface EventsColumns {
812df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden
813df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden        /**
814c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The {@link Calendars#_ID} of the calendar the event belongs to.
815c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Column name.
816c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER</P>
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CALENDAR_ID = "calendar_id";
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
821c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The title of the event. Column name.
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String TITLE = "title";
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
827c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The description of the event. Column name.
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DESCRIPTION = "description";
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
833c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Where the event takes place. Column name.
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_LOCATION = "eventLocation";
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
839f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * A secondary color for the individual event. This should only be
840f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * updated by the sync adapter for a given account.
8419734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: INTEGER</P>
8429734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8439734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String EVENT_COLOR = "eventColor";
8449734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8459734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
8464172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * A secondary color key for the individual event. NULL or an empty
8474172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * string are reserved for indicating that the event does not use a key
8484172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * for looking up the color. The provider will update
8494172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * {@link #EVENT_COLOR} automatically when a valid key is written to
8504172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * this column. The key must reference an existing row of the
8518a8eebcbe8e3aded682c9c4937e155218ddf7ff4RoboErik         * {@link Colors} table. @see Colors
8528a8eebcbe8e3aded682c9c4937e155218ddf7ff4RoboErik         * <P>
8538a8eebcbe8e3aded682c9c4937e155218ddf7ff4RoboErik         * Type: TEXT
8548a8eebcbe8e3aded682c9c4937e155218ddf7ff4RoboErik         * </P>
855f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
8564172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik        public static final String EVENT_COLOR_KEY = "eventColor_index";
857f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
858f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
859c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The event status. Column name.
860c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (one of {@link #STATUS_TENTATIVE}...)</P>
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String STATUS = "eventStatus";
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int STATUS_TENTATIVE = 0;
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int STATUS_CONFIRMED = 1;
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int STATUS_CANCELED = 2;
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This is a copy of the attendee status for the owner of this event.
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This field is copied here so that we can efficiently filter out
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * events that are declined without having to look in the Attendees
872c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * table. Column name.
8735b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff         *
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String SELF_ATTENDEE_STATUS = "selfAttendeeStatus";
8775b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
879c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * This column is available for use by sync adapters. Column name.
88064a556d755d27b1182897e9243cf4f3016e76a88Marc Blank         * <P>Type: TEXT</P>
88164a556d755d27b1182897e9243cf4f3016e76a88Marc Blank         */
882651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String SYNC_DATA1 = "sync_data1";
88364a556d755d27b1182897e9243cf4f3016e76a88Marc Blank
88464a556d755d27b1182897e9243cf4f3016e76a88Marc Blank        /**
8859734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8869734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8879734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8889734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA2 = "sync_data2";
8899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
8919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA3 = "sync_data3";
8959734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
8979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8989734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8999734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
9009734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA4 = "sync_data4";
9019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9029734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
9039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
9049734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
9059734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
9069734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA5 = "sync_data5";
9079734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9089734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
9099734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
9109734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
9119734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
9129734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA6 = "sync_data6";
9139734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9149734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
9159734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
916866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * <P>Type: TEXT</P>
917866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         */
918866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        public static final String SYNC_DATA7 = "sync_data7";
919866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert
920866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        /**
9219734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
9229734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
9239734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
9249734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA8 = "sync_data8";
9259734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9269734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
9279734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
9289734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
9299734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
9309734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA9 = "sync_data9";
9319734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9329734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
9339734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
9349734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
9359734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
9369734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA10 = "sync_data10";
9379734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
9389734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
939866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * Used to indicate that a row is not a real event but an original copy of a locally
940866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * modified event. A copy is made when an event changes from non-dirty to dirty and the
941866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * event is on a calendar with {@link Calendars#CAN_PARTIALLY_UPDATE} set to 1. This copy
942866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * does not get expanded in the instances table and is only visible in queries made by a
943866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * sync adapter. The copy gets removed when the event is changed back to non-dirty by a
944866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * sync adapter.
945866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * <P>Type: INTEGER (boolean)</P>
946866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         */
947866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        public static final String LAST_SYNCED = "lastSynced";
948866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert
949866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        /**
950c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The time the event starts in UTC millis since epoch. Column name.
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DTSTART = "dtstart";
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
956c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The time the event ends in UTC millis since epoch. Column name.
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DTEND = "dtend";
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
962c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The duration of the event in RFC2445 format. Column name.
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT (duration in RFC2445 format)</P>
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DURATION = "duration";
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
968c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The timezone for the event. Column name.
969c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: TEXT</P>
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_TIMEZONE = "eventTimezone";
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
974c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The timezone for the end time of the event. Column name.
975c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: TEXT</P>
976c07b06f12ac1f93b35f3e120a5e7d6aa5f934c6fErik         */
977651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String EVENT_END_TIMEZONE = "eventEndTimezone";
978c07b06f12ac1f93b35f3e120a5e7d6aa5f934c6fErik
979c07b06f12ac1f93b35f3e120a5e7d6aa5f934c6fErik        /**
980c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Is the event all day (time zone independent). Column name.
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ALL_DAY = "allDay";
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
986651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Defines how the event shows up for others when the calendar is
987c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * shared. Column name.
988c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (One of {@link #ACCESS_DEFAULT}, ...)</P>
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
990651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String ACCESS_LEVEL = "accessLevel";
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
992651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
993651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Default access is controlled by the server and will be treated as
994651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * public on the device.
995651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
996651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int ACCESS_DEFAULT = 0;
997651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
998651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Confidential is not used by the app.
999651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1000651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int ACCESS_CONFIDENTIAL = 1;
1001651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1002c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Private shares the event as a free/busy slot with no details.
1003651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1004651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int ACCESS_PRIVATE = 2;
1005651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1006c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Public makes the contents visible to anyone with access to the
1007651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * calendar.
1008651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1009651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int ACCESS_PUBLIC = 3;
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1012651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * If this event counts as busy time or is still free time that can be
1013c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * scheduled over. Column name.
10144172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * <P>
10154172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * Type: INTEGER (One of {@link #AVAILABILITY_BUSY},
10164172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * {@link #AVAILABILITY_FREE}, {@link #AVAILABILITY_TENTATIVE})
10174172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * </P>
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1019651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String AVAILABILITY = "availability";
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1021651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1022651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Indicates that this event takes up time and will conflict with other
1023651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * events.
1024651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1025651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int AVAILABILITY_BUSY = 0;
1026651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1027651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Indicates that this event is free time and will not conflict with
1028651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * other events.
1029651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1030651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int AVAILABILITY_FREE = 1;
1031f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
1032f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * Indicates that the owner's availability may change, but should be
1033f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * considered busy time that will conflict.
1034f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
1035f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final int AVAILABILITY_TENTATIVE = 2;
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1038c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether the event has an alarm or not. Column name.
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String HAS_ALARM = "hasAlarm";
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1044c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether the event has extended properties or not. Column name.
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String HAS_EXTENDED_PROPERTIES = "hasExtendedProperties";
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1050c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The recurrence rule for the event. Column name.
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String RRULE = "rrule";
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1056c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The recurrence dates for the event. Column name.
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String RDATE = "rdate";
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1062c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The recurrence exception rule for the event. Column name.
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EXRULE = "exrule";
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1068c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The recurrence exception dates for the event. Column name.
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EXDATE = "exdate";
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1074c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The {@link Events#_ID} of the original recurring event for which this
1075c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * event is an exception. Column name.
1076c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik         * <P>Type: TEXT</P>
1077c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik         */
1078c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik        public static final String ORIGINAL_ID = "original_id";
1079c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik
1080c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik        /**
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The _sync_id of the original recurring event for which this event is
1082c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik         * an exception. The provider should keep the original_id in sync when
1083c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * this is updated. Column name.
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1086651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String ORIGINAL_SYNC_ID = "original_sync_id";
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The original instance time of the recurring event for which this
1090c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * event is an exception. Column name.
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ORIGINAL_INSTANCE_TIME = "originalInstanceTime";
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The allDay status (true or false) of the original recurring event
1097c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * for which this event is an exception. Column name.
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ORIGINAL_ALL_DAY = "originalAllDay";
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1103c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The last date this event repeats on, or NULL if it never ends. Column
1104c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * name.
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String LAST_DATE = "lastDate";
110879f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff
110979f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff        /**
111079f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff         * Whether the event has attendee information.  True if the event
111179f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff         * has full attendee data, false if the event has information about
1112c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * self only. Column name.
111379f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff         * <P>Type: INTEGER (boolean)</P>
111479f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff         */
111579f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff        public static final String HAS_ATTENDEE_DATA = "hasAttendeeData";
11163d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
11173d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1118c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether guests can modify the event. Column name.
11193d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: INTEGER (boolean)</P>
11203d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
11213d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String GUESTS_CAN_MODIFY = "guestsCanModify";
11223d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
11233d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1124c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether guests can invite other guests. Column name.
11253d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: INTEGER (boolean)</P>
11263d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
11273d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String GUESTS_CAN_INVITE_OTHERS = "guestsCanInviteOthers";
11283d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
11293d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1130c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether guests can see the list of attendees. Column name.
11313d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: INTEGER (boolean)</P>
11323d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
11333d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String GUESTS_CAN_SEE_GUESTS = "guestsCanSeeGuests";
11343d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
11353d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1136c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Email of the organizer (owner) of the event. Column name.
11373d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: STRING</P>
11383d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
11393d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String ORGANIZER = "organizer";
11403d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
11413d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1142c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether the user can invite others to the event. The
1143c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * GUESTS_CAN_INVITE_OTHERS is a setting that applies to an arbitrary
1144c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * guest, while CAN_INVITE_OTHERS indicates if the user can invite
1145c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * others (either through GUESTS_CAN_INVITE_OTHERS or because the user
1146c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * has modify access to the event). Column name.
11473d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: INTEGER (boolean, readonly)</P>
11483d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
11493d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String CAN_INVITE_OTHERS = "canInviteOthers";
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1153c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Class that represents an Event Entity. There is one entry per event.
1154c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Recurring events show up as a single entry. This is a helper class to
1155c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * make batch operations easier. A {@link ContentResolver} or
1156c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * {@link ContentProviderClient} is required as the helper does additional
1157c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * queries to add reminders and attendees to each entry.
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1159651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik    public static final class EventsEntity implements BaseColumns, SyncColumns, EventsColumns {
1160328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
1161328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         * The content:// style URL for this table
1162328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
1163a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
1164a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                "/event_entities");
1165328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1166c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
11673672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
11683672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
11693672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private EventsEntity() {}
11703672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
11713672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
1172c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Creates a new iterator for events
1173c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
1174c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cursor An event query
1175c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param resolver For performing additional queries
1176c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return an EntityIterator containing one entity per event in the
1177c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         cursor
1178c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
1179328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        public static EntityIterator newEntityIterator(Cursor cursor, ContentResolver resolver) {
1180328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            return new EntityIteratorImpl(cursor, resolver);
1181328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        }
1182328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1183c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1184c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Creates a new iterator for events
1185c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
1186c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cursor An event query
1187c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param provider For performing additional queries
1188c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return an EntityIterator containing one entity per event in the
1189c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         cursor
1190c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
1191328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        public static EntityIterator newEntityIterator(Cursor cursor,
1192328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                ContentProviderClient provider) {
1193328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            return new EntityIteratorImpl(cursor, provider);
1194328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        }
1195328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1196328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        private static class EntityIteratorImpl extends CursorEntityIterator {
1197328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private final ContentResolver mResolver;
1198328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private final ContentProviderClient mProvider;
1199328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1200328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final String[] REMINDERS_PROJECTION = new String[] {
1201328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Reminders.MINUTES,
1202328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Reminders.METHOD,
1203328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            };
1204328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_MINUTES = 0;
1205328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_METHOD = 1;
1206328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1207328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final String[] ATTENDEES_PROJECTION = new String[] {
1208328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_NAME,
1209328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_EMAIL,
1210328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_RELATIONSHIP,
1211328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_TYPE,
1212328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_STATUS,
1213328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            };
1214328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_NAME = 0;
1215328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_EMAIL = 1;
1216328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_RELATIONSHIP = 2;
1217328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_TYPE = 3;
1218328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_STATUS = 4;
1219328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final String[] EXTENDED_PROJECTION = new String[] {
12208f643c1040d45f03584b0382c7c5d933388b9103Marc Blank                    ExtendedProperties._ID,
1221328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    ExtendedProperties.NAME,
12228f643c1040d45f03584b0382c7c5d933388b9103Marc Blank                    ExtendedProperties.VALUE
1223328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            };
12248f643c1040d45f03584b0382c7c5d933388b9103Marc Blank            private static final int COLUMN_ID = 0;
12258f643c1040d45f03584b0382c7c5d933388b9103Marc Blank            private static final int COLUMN_NAME = 1;
12268f643c1040d45f03584b0382c7c5d933388b9103Marc Blank            private static final int COLUMN_VALUE = 2;
1227328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
12281dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio            private static final String WHERE_EVENT_ID = "event_id=?";
12291dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
1230328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            public EntityIteratorImpl(Cursor cursor, ContentResolver resolver) {
1231328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                super(cursor);
1232328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                mResolver = resolver;
1233328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                mProvider = null;
1234328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            }
1235328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1236328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            public EntityIteratorImpl(Cursor cursor, ContentProviderClient provider) {
1237328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                super(cursor);
1238328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                mResolver = null;
1239328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                mProvider = provider;
1240328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            }
1241328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
124264a556d755d27b1182897e9243cf4f3016e76a88Marc Blank            @Override
1243328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            public Entity getEntityAndIncrementCursor(Cursor cursor) throws RemoteException {
1244328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                // we expect the cursor is already at the row we need to read from
1245328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                final long eventId = cursor.getLong(cursor.getColumnIndexOrThrow(Events._ID));
1246328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                ContentValues cv = new ContentValues();
1247328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                cv.put(Events._ID, eventId);
1248328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, CALENDAR_ID);
1249328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, TITLE);
1250328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, DESCRIPTION);
1251328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_LOCATION);
1252328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, STATUS);
1253328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, SELF_ATTENDEE_STATUS);
1254328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DTSTART);
1255328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DTEND);
1256328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, DURATION);
1257328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_TIMEZONE);
1258c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_END_TIMEZONE);
1259328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ALL_DAY);
1260651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, ACCESS_LEVEL);
1261651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, AVAILABILITY);
1262328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, HAS_ALARM);
1263328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
1264328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        HAS_EXTENDED_PROPERTIES);
1265328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, RRULE);
1266328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, RDATE);
1267328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EXRULE);
1268328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EXDATE);
1269651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORIGINAL_SYNC_ID);
1270c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORIGINAL_ID);
1271328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv,
1272328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        ORIGINAL_INSTANCE_TIME);
1273328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, ORIGINAL_ALL_DAY);
1274328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, LAST_DATE);
1275328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, HAS_ATTENDEE_DATA);
1276328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
1277328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        GUESTS_CAN_INVITE_OTHERS);
1278328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, GUESTS_CAN_MODIFY);
1279328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, GUESTS_CAN_SEE_GUESTS);
1280328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORGANIZER);
1281328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_ID);
1282651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DIRTY);
1283866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, LAST_SYNCED);
1284c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, DELETED);
12859734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA1);
12869734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA2);
12879734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA3);
12889734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA4);
12899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA5);
12909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA6);
12919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA7);
12929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA8);
12939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA9);
12949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA10);
1295be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC1);
1296be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC2);
1297be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC3);
1298be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC4);
1299be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC5);
1300be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC6);
13019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC7);
13029734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC8);
13039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC9);
13049734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC10);
1305328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1306328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                Entity entity = new Entity(cv);
1307328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                Cursor subCursor;
1308328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                if (mResolver != null) {
1309328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mResolver.query(Reminders.CONTENT_URI, REMINDERS_PROJECTION,
13101dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
13111dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) }  /* selectionArgs */,
13121dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1313328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } else {
1314328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mProvider.query(Reminders.CONTENT_URI, REMINDERS_PROJECTION,
13151dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
13161dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) }  /* selectionArgs */,
13171dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1318328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1319328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                try {
1320328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    while (subCursor.moveToNext()) {
1321328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        ContentValues reminderValues = new ContentValues();
1322328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        reminderValues.put(Reminders.MINUTES, subCursor.getInt(COLUMN_MINUTES));
1323328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        reminderValues.put(Reminders.METHOD, subCursor.getInt(COLUMN_METHOD));
1324328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        entity.addSubValue(Reminders.CONTENT_URI, reminderValues);
1325328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    }
1326328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } finally {
1327328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor.close();
1328328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1329328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1330328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                if (mResolver != null) {
1331328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mResolver.query(Attendees.CONTENT_URI, ATTENDEES_PROJECTION,
13321dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
13331dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) } /* selectionArgs */,
13341dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1335328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } else {
1336328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mProvider.query(Attendees.CONTENT_URI, ATTENDEES_PROJECTION,
13371dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
13381dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) } /* selectionArgs */,
13391dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1340328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1341328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                try {
1342328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    while (subCursor.moveToNext()) {
1343328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        ContentValues attendeeValues = new ContentValues();
1344328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_NAME,
1345328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getString(COLUMN_ATTENDEE_NAME));
1346328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_EMAIL,
1347328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getString(COLUMN_ATTENDEE_EMAIL));
1348328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_RELATIONSHIP,
1349328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getInt(COLUMN_ATTENDEE_RELATIONSHIP));
1350328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_TYPE,
1351328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getInt(COLUMN_ATTENDEE_TYPE));
1352328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_STATUS,
1353328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getInt(COLUMN_ATTENDEE_STATUS));
1354328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        entity.addSubValue(Attendees.CONTENT_URI, attendeeValues);
1355328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    }
1356328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } finally {
1357328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor.close();
1358328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1359328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1360328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                if (mResolver != null) {
1361328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mResolver.query(ExtendedProperties.CONTENT_URI, EXTENDED_PROJECTION,
13621dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
13631dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) } /* selectionArgs */,
13641dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1365328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } else {
1366328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mProvider.query(ExtendedProperties.CONTENT_URI, EXTENDED_PROJECTION,
13671dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
13681dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) } /* selectionArgs */,
13691dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1370328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1371328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                try {
1372328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    while (subCursor.moveToNext()) {
1373328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        ContentValues extendedValues = new ContentValues();
13748f643c1040d45f03584b0382c7c5d933388b9103Marc Blank                        extendedValues.put(ExtendedProperties._ID,
13758f643c1040d45f03584b0382c7c5d933388b9103Marc Blank                                subCursor.getString(COLUMN_ID));
13763b16892c6bc6b804133163db24ffc5ff54b9a8fbKen Shirriff                        extendedValues.put(ExtendedProperties.NAME,
13773b16892c6bc6b804133163db24ffc5ff54b9a8fbKen Shirriff                                subCursor.getString(COLUMN_NAME));
1378328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        extendedValues.put(ExtendedProperties.VALUE,
13793b16892c6bc6b804133163db24ffc5ff54b9a8fbKen Shirriff                                subCursor.getString(COLUMN_VALUE));
1380328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        entity.addSubValue(ExtendedProperties.CONTENT_URI, extendedValues);
1381328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    }
1382328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } finally {
1383328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor.close();
1384328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1385328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1386328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                cursor.moveToNext();
1387328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                return entity;
1388328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            }
1389328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        }
1390328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana    }
1391328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1392328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana    /**
1393f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * Constants and helpers for the Events table, which contains details for
1394f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * individual events. <h3>Operations</h3> All operations can be done either
1395f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * as an app or as a sync adapter. To perform an operation as a sync adapter
1396f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #CALLER_IS_SYNCADAPTER} should be set to true and
1397f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #ACCOUNT_NAME} and {@link #ACCOUNT_TYPE} must be set in the Uri
1398f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * parameters. See
1399f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link Uri.Builder#appendQueryParameter(java.lang.String, java.lang.String)}
1400f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * for details on adding parameters. Sync adapters have write access to more
1401f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * columns but are restricted to a single account at a time.
1402fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dl>
1403fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dt><b>Insert</b></dt>
1404fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dd>When inserting a new event the following fields must be included:
1405fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <ul>
1406fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>dtstart</li>
1407e6fbf65de6eb8fa3ef87291d86de426e568c19ebMichael Chan     * <li>dtend if the event is non-recurring</li>
1408e6fbf65de6eb8fa3ef87291d86de426e568c19ebMichael Chan     * <li>duration if the event is recurring</li>
1409e6fbf65de6eb8fa3ef87291d86de426e568c19ebMichael Chan     * <li>rrule or rdate if the event is recurring</li>
14104172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik     * <li>eventTimezone</li>
1411fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>a calendar_id</li>
1412fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </ul>
1413fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * There are also further requirements when inserting or updating an event.
1414fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * See the section on Writing to Events.</dd>
1415fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dt><b>Update</b></dt>
1416f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>To perform an update of an Event the {@link Events#_ID} of the event
1417f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * should be provided either as an appended id to the Uri (
1418fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * {@link ContentUris#withAppendedId}) or as the first selection item--the
1419fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * selection should start with "_id=?" and the first selectionArg should be
1420f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * the _id of the event. Updates may also be done using a selection and no
1421f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * id. Updating an event must respect the same rules as inserting and is
1422f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * further restricted in the fields that can be written. See the section on
1423f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * Writing to Events.</dd>
1424fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dt><b>Delete</b></dt>
1425fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dd>Events can be deleted either by the {@link Events#_ID} as an appended
1426fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * id on the Uri or using any standard selection. If an appended id is used
1427fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * a selection is not allowed. There are two versions of delete: as an app
1428fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * and as a sync adapter. An app delete will set the deleted column on an
1429fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * event and remove all instances of that event. A sync adapter delete will
1430fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * remove the event from the database and all associated data.</dd>
1431fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dt><b>Query</b></dt>
1432fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dd>Querying the Events table will get you all information about a set of
1433fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * events except their reminders, attendees, and extended properties. There
1434fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * will be one row returned for each event that matches the query selection,
1435fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * or at most a single row if the {@link Events#_ID} is appended to the Uri.
1436fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * Recurring events will only return a single row regardless of the number
1437fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * of times that event repeats.</dd>
1438fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </dl>
1439fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <h3>Writing to Events</h3> There are further restrictions on all Updates
1440fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * and Inserts in the Events table:
1441fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <ul>
1442fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>If allDay is set to 1 eventTimezone must be {@link Time#TIMEZONE_UTC}
1443fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * and the time must correspond to a midnight boundary.</li>
1444fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>Exceptions are not allowed to recur. If rrule or rdate is not empty,
1445fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * original_id and original_sync_id must be empty.</li>
1446fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>In general a calendar_id should not be modified after insertion. This
1447fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * is not explicitly forbidden but many sync adapters will not behave in an
1448fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * expected way if the calendar_id is modified.</li>
1449fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </ul>
1450fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * The following Events columns are writable by both an app and a sync
1451fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * adapter.
1452fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <ul>
1453fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #CALENDAR_ID}</li>
1454fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORGANIZER}</li>
1455fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #TITLE}</li>
1456fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EVENT_LOCATION}</li>
1457fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DESCRIPTION}</li>
1458fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EVENT_COLOR}</li>
1459fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DTSTART}</li>
1460fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DTEND}</li>
1461fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EVENT_TIMEZONE}</li>
1462fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EVENT_END_TIMEZONE}</li>
1463fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DURATION}</li>
1464fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ALL_DAY}</li>
1465fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #RRULE}</li>
1466fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #RDATE}</li>
1467fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EXRULE}</li>
1468fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EXDATE}</li>
1469fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORIGINAL_ID}</li>
1470fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORIGINAL_SYNC_ID}</li>
1471fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORIGINAL_INSTANCE_TIME}</li>
1472fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORIGINAL_ALL_DAY}</li>
1473fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ACCESS_LEVEL}</li>
1474fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #AVAILABILITY}</li>
1475fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #GUESTS_CAN_MODIFY}</li>
1476fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #GUESTS_CAN_INVITE_OTHERS}</li>
1477fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #GUESTS_CAN_SEE_GUESTS}</li>
1478fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </ul>
1479fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * The following Events columns are writable only by a sync adapter
1480fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <ul>
1481fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DIRTY}</li>
1482fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #_SYNC_ID}</li>
1483fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA1}</li>
1484fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA2}</li>
1485fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA3}</li>
1486fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA4}</li>
1487fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA5}</li>
1488fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA6}</li>
1489fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA7}</li>
1490fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA8}</li>
1491fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA9}</li>
1492fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA10}</li>
1493fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </ul>
1494fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * The remaining columns are either updated by the provider only or are
1495fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * views into other tables and cannot be changed through the Events table.
1496328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana     */
14979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik    public static final class Events implements BaseColumns, SyncColumns, EventsColumns,
1498e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            CalendarColumns {
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1500c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1501c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for interacting with events. Appending an
1502c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * event id using {@link ContentUris#withAppendedId(Uri, long)} will
1503c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * specify a single event.
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1505c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri CONTENT_URI =
1507a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                Uri.parse("content://" + AUTHORITY + "/events");
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
15104a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden         * The content:// style URI for recurring event exceptions.  Insertions require an
15114a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden         * appended event ID.  Deletion of exceptions requires both the original event ID and
15124a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden         * the exception event ID (see {@link Uri.Builder#appendPath}).
15134a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden         */
1514083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final Uri CONTENT_EXCEPTION_URI =
15154a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden                Uri.parse("content://" + AUTHORITY + "/exception");
15164a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden
15174a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden        /**
15183672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
15193672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
15203672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Events() {}
15213672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
15223672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1525c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String DEFAULT_SORT_ORDER = "";
1526651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik
1527651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1528651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * These are columns that should only ever be updated by the provider,
1529651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * either because they are views mapped to another table or because they
1530083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * are used for provider only functionality. TODO move to provider
1531083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         *
1532083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
1533651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1534651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static String[] PROVIDER_WRITABLE_COLUMNS = new String[] {
1535651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                ACCOUNT_NAME,
1536c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                ACCOUNT_TYPE,
1537c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC1,
1538c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC2,
1539c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC3,
1540c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC4,
1541c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC5,
1542866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                CAL_SYNC6,
15439734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAL_SYNC7,
15449734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAL_SYNC8,
15459734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAL_SYNC9,
15469734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAL_SYNC10,
15479734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                ALLOWED_REMINDERS,
1548c7ef9390cf37c5e87d1015a83f113df6a2d1b3e5RoboErik                ALLOWED_ATTENDEE_TYPES,
1549c7ef9390cf37c5e87d1015a83f113df6a2d1b3e5RoboErik                ALLOWED_AVAILABILITY,
15509734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CALENDAR_ACCESS_LEVEL,
15519734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CALENDAR_COLOR,
15529734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CALENDAR_TIME_ZONE,
15539734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAN_MODIFY_TIME_ZONE,
15549734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAN_ORGANIZER_RESPOND,
15559734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CALENDAR_DISPLAY_NAME,
1556866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                CAN_PARTIALLY_UPDATE,
15579734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                SYNC_EVENTS,
15589734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                VISIBLE,
1559651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        };
1560651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik
1561651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1562651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * These fields are only writable by a sync adapter. To modify them the
1563651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * caller must include CALLER_IS_SYNCADAPTER, _SYNC_ACCOUNT, and
1564083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * _SYNC_ACCOUNT_TYPE in the query parameters. TODO move to provider.
1565083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         *
1566083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
1567651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1568651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String[] SYNC_WRITABLE_COLUMNS = new String[] {
1569651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            _SYNC_ID,
1570651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            DIRTY,
15719734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA1,
15729734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA2,
15739734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA3,
15749734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA4,
15759734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA5,
15769734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA6,
15779734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA7,
15789734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA8,
15799734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA9,
15809734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA10,
1581651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        };
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1585c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Fields and helpers for interacting with Instances. An instance is a
1586c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * single occurrence of an event including time zone specific start and end
15873771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * days and minutes. The instances table is not writable and only provides a
15883771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * way to query event occurrences.
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1590e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik    public static final class Instances implements BaseColumns, EventsColumns, CalendarColumns {
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1592e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik        private static final String WHERE_CALENDARS_SELECTED = Calendars.VISIBLE + "=?";
1593e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik        private static final String[] WHERE_CALENDARS_ARGS = {
1594e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            "1"
1595e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik        };
15961dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
1597c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
15983672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
15993672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
16003672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Instances() {}
16013672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
16023672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
1603c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Performs a query to return all visible instances in the given range.
1604c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * This is a blocking function and should not be done on the UI thread.
1605c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * This will cause an expansion of recurring events to fill this time
1606c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * range if they are not already expanded and will slow down for larger
1607c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * time ranges with many recurring events.
1608c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
1609c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cr The ContentResolver to use for the query
1610c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param projection The columns to return
1611c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param begin The start of the time range to query in UTC millis since
1612c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
1613c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param end The end of the time range to query in UTC millis since
1614c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
1615c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return A Cursor containing all instances in the given range
1616c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Cursor query(ContentResolver cr, String[] projection,
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                         long begin, long end) {
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri.Builder builder = CONTENT_URI.buildUpon();
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentUris.appendId(builder, begin);
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentUris.appendId(builder, end);
16221dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio            return cr.query(builder.build(), projection, WHERE_CALENDARS_SELECTED,
1623e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik                    WHERE_CALENDARS_ARGS, DEFAULT_SORT_ORDER);
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1626c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1627c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Performs a query to return all visible instances in the given range
1628c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * that match the given query. This is a blocking function and should
1629c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * not be done on the UI thread. This will cause an expansion of
1630c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * recurring events to fill this time range if they are not already
1631c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * expanded and will slow down for larger time ranges with many
1632c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * recurring events.
1633c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
1634c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cr The ContentResolver to use for the query
1635c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param projection The columns to return
1636c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param begin The start of the time range to query in UTC millis since
1637c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
1638c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param end The end of the time range to query in UTC millis since
1639c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
1640c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param searchQuery A string of space separated search terms. Segments
1641c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            enclosed by double quotes will be treated as a single
1642c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            term.
1643c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return A Cursor of instances matching the search terms in the given
1644c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         time range
1645c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Cursor query(ContentResolver cr, String[] projection,
164719f845804c4b8f295669bbe7338d91d42451a0fdMason Tang                                         long begin, long end, String searchQuery) {
164819f845804c4b8f295669bbe7338d91d42451a0fdMason Tang            Uri.Builder builder = CONTENT_SEARCH_URI.buildUpon();
164919f845804c4b8f295669bbe7338d91d42451a0fdMason Tang            ContentUris.appendId(builder, begin);
165019f845804c4b8f295669bbe7338d91d42451a0fdMason Tang            ContentUris.appendId(builder, end);
1651c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            builder = builder.appendPath(searchQuery);
1652e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            return cr.query(builder.build(), projection, WHERE_CALENDARS_SELECTED,
1653e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik                    WHERE_CALENDARS_ARGS, DEFAULT_SORT_ORDER);
165419f845804c4b8f295669bbe7338d91d42451a0fdMason Tang        }
165519f845804c4b8f295669bbe7338d91d42451a0fdMason Tang
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1657c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for querying an instance range. The begin
1658c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * and end of the range to query should be added as path segments if
1659c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * this is used directly.
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1661c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
1662a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
1663a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                "/instances/when");
1664c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1665c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for querying an instance range by Julian
1666c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Day. The start and end day should be added as path segments if this
1667c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * is used directly.
1668c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
16692cfb0d166b5e8a0e89b2b3d19abe4f76ff38cfabMichael Chan        public static final Uri CONTENT_BY_DAY_URI =
1670a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff            Uri.parse("content://" + AUTHORITY + "/instances/whenbyday");
1671c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1672c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for querying an instance range with a search
1673c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * term. The begin, end, and search string should be appended as path
1674c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * segments if this is used directly.
1675c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
167619f845804c4b8f295669bbe7338d91d42451a0fdMason Tang        public static final Uri CONTENT_SEARCH_URI = Uri.parse("content://" + AUTHORITY +
167719f845804c4b8f295669bbe7338d91d42451a0fdMason Tang                "/instances/search");
1678c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1679c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for querying an instance range with a search
1680c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * term. The start day, end day, and search string should be appended as
1681c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * path segments if this is used directly.
1682c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
168319f845804c4b8f295669bbe7338d91d42451a0fdMason Tang        public static final Uri CONTENT_SEARCH_BY_DAY_URI =
168419f845804c4b8f295669bbe7338d91d42451a0fdMason Tang            Uri.parse("content://" + AUTHORITY + "/instances/searchbyday");
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table.
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1689c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String DEFAULT_SORT_ORDER = "begin ASC";
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1692c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The beginning time of the instance, in UTC milliseconds. Column name.
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String BEGIN = "begin";
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1698c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The ending time of the instance, in UTC milliseconds. Column name.
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String END = "end";
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1704c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The _id of the event for this instance. Column name.
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long, foreign key to the Events table)</P>
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1710c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Julian start day of the instance, relative to the local time
1711c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * zone. Column name.
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String START_DAY = "startDay";
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1717c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Julian end day of the instance, relative to the local time
1718c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * zone. Column name.
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String END_DAY = "endDay";
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The start minute of the instance measured from midnight in the
1725c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * local time zone. Column name.
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String START_MINUTE = "startMinute";
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The end minute of the instance measured from midnight in the
1732c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * local time zone. Column name.
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String END_MINUTE = "endMinute";
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1738b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface CalendarCacheColumns {
173971ad58c751eb12a500916556c41e704a93895801Erik        /**
1740c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The key for the setting. Keys are defined in {@link CalendarCache}.
174171ad58c751eb12a500916556c41e704a93895801Erik         */
174271ad58c751eb12a500916556c41e704a93895801Erik        public static final String KEY = "key";
174371ad58c751eb12a500916556c41e704a93895801Erik
174471ad58c751eb12a500916556c41e704a93895801Erik        /**
174571ad58c751eb12a500916556c41e704a93895801Erik         * The value of the given setting.
174671ad58c751eb12a500916556c41e704a93895801Erik         */
174771ad58c751eb12a500916556c41e704a93895801Erik        public static final String VALUE = "value";
174871ad58c751eb12a500916556c41e704a93895801Erik    }
174971ad58c751eb12a500916556c41e704a93895801Erik
1750083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik    /**
1751083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     * CalendarCache stores some settings for calendar including the current
1752083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     * time zone for the instances. These settings are stored using a key/value
1753083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     * scheme. A {@link #KEY} must be specified when updating these values.
1754083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     */
17553672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    public static final class CalendarCache implements CalendarCacheColumns {
175671ad58c751eb12a500916556c41e704a93895801Erik        /**
175771ad58c751eb12a500916556c41e704a93895801Erik         * The URI to use for retrieving the properties from the Calendar db.
175871ad58c751eb12a500916556c41e704a93895801Erik         */
175971ad58c751eb12a500916556c41e704a93895801Erik        public static final Uri URI =
176071ad58c751eb12a500916556c41e704a93895801Erik                Uri.parse("content://" + AUTHORITY + "/properties");
176171ad58c751eb12a500916556c41e704a93895801Erik
176271ad58c751eb12a500916556c41e704a93895801Erik        /**
17633672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
17643672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
17653672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private CalendarCache() {}
17663672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
17673672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
176871ad58c751eb12a500916556c41e704a93895801Erik         * They key for updating the use of auto/home time zones in Calendar.
176971ad58c751eb12a500916556c41e704a93895801Erik         * Valid values are {@link #TIMEZONE_TYPE_AUTO} or
177071ad58c751eb12a500916556c41e704a93895801Erik         * {@link #TIMEZONE_TYPE_HOME}.
177171ad58c751eb12a500916556c41e704a93895801Erik         */
1772083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final String KEY_TIMEZONE_TYPE = "timezoneType";
177371ad58c751eb12a500916556c41e704a93895801Erik
177471ad58c751eb12a500916556c41e704a93895801Erik        /**
177571ad58c751eb12a500916556c41e704a93895801Erik         * The key for updating the time zone used by the provider when it
177671ad58c751eb12a500916556c41e704a93895801Erik         * generates the instances table. This should only be written if the
177771ad58c751eb12a500916556c41e704a93895801Erik         * type is set to {@link #TIMEZONE_TYPE_HOME}. A valid time zone id
177871ad58c751eb12a500916556c41e704a93895801Erik         * should be written to this field.
177971ad58c751eb12a500916556c41e704a93895801Erik         */
1780083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final String KEY_TIMEZONE_INSTANCES = "timezoneInstances";
178171ad58c751eb12a500916556c41e704a93895801Erik
178271ad58c751eb12a500916556c41e704a93895801Erik        /**
178371ad58c751eb12a500916556c41e704a93895801Erik         * The key for reading the last time zone set by the user. This should
178471ad58c751eb12a500916556c41e704a93895801Erik         * only be read by apps and it will be automatically updated whenever
1785083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * {@link #KEY_TIMEZONE_INSTANCES} is updated with
178671ad58c751eb12a500916556c41e704a93895801Erik         * {@link #TIMEZONE_TYPE_HOME} set.
178771ad58c751eb12a500916556c41e704a93895801Erik         */
1788083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final String KEY_TIMEZONE_INSTANCES_PREVIOUS = "timezoneInstancesPrevious";
178971ad58c751eb12a500916556c41e704a93895801Erik
179071ad58c751eb12a500916556c41e704a93895801Erik        /**
1791083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * The value to write to {@link #KEY_TIMEZONE_TYPE} if the provider
179271ad58c751eb12a500916556c41e704a93895801Erik         * should stay in sync with the device's time zone.
179371ad58c751eb12a500916556c41e704a93895801Erik         */
179471ad58c751eb12a500916556c41e704a93895801Erik        public static final String TIMEZONE_TYPE_AUTO = "auto";
179571ad58c751eb12a500916556c41e704a93895801Erik
179671ad58c751eb12a500916556c41e704a93895801Erik        /**
1797083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * The value to write to {@link #KEY_TIMEZONE_TYPE} if the provider
179871ad58c751eb12a500916556c41e704a93895801Erik         * should use a fixed time zone set by the user.
179971ad58c751eb12a500916556c41e704a93895801Erik         */
180071ad58c751eb12a500916556c41e704a93895801Erik        public static final String TIMEZONE_TYPE_HOME = "home";
180171ad58c751eb12a500916556c41e704a93895801Erik    }
180271ad58c751eb12a500916556c41e704a93895801Erik
180371ad58c751eb12a500916556c41e704a93895801Erik    /**
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A few Calendar globals are needed in the CalendarProvider for expanding
180559dab49cb8350afd1baa77999ec2f91283d78536RoboErik     * the Instances table and these are all stored in the first (and only) row
180659dab49cb8350afd1baa77999ec2f91283d78536RoboErik     * of the CalendarMetaData table.
180759dab49cb8350afd1baa77999ec2f91283d78536RoboErik     *
180859dab49cb8350afd1baa77999ec2f91283d78536RoboErik     * @hide
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1810b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface CalendarMetaDataColumns {
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The local timezone that was used for precomputing the fields
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in the Instances table.
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String LOCAL_TIMEZONE = "localTimezone";
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The minimum time used in expanding the Instances table,
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in UTC milliseconds.
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MIN_INSTANCE = "minInstance";
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum time used in expanding the Instances table,
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in UTC milliseconds.
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MAX_INSTANCE = "maxInstance";
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
18323763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * The minimum Julian day in the EventDays table.
18333763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * <P>Type: INTEGER</P>
18343763464e8f0df4d387ff46803e5a9c76045c85e6Erik         */
18353763464e8f0df4d387ff46803e5a9c76045c85e6Erik        public static final String MIN_EVENTDAYS = "minEventDays";
18363763464e8f0df4d387ff46803e5a9c76045c85e6Erik
18373763464e8f0df4d387ff46803e5a9c76045c85e6Erik        /**
18383763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * The maximum Julian day in the EventDays table.
18393763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * <P>Type: INTEGER</P>
18403763464e8f0df4d387ff46803e5a9c76045c85e6Erik         */
18413763464e8f0df4d387ff46803e5a9c76045c85e6Erik        public static final String MAX_EVENTDAYS = "maxEventDays";
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18435b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
1844c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
1845c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * @hide
1846c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
1847505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    public static final class CalendarMetaData implements CalendarMetaDataColumns, BaseColumns {
18483672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
18493672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
18503672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
18513672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
18523672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private CalendarMetaData() {}
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18543763464e8f0df4d387ff46803e5a9c76045c85e6Erik
1855b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface EventDaysColumns {
18563763464e8f0df4d387ff46803e5a9c76045c85e6Erik        /**
1857c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Julian starting day number. Column name.
18583763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * <P>Type: INTEGER (int)</P>
18593763464e8f0df4d387ff46803e5a9c76045c85e6Erik         */
18603763464e8f0df4d387ff46803e5a9c76045c85e6Erik        public static final String STARTDAY = "startDay";
1861c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1862c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Julian ending day number. Column name.
1863c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (int)</P>
1864c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
1865bd8e2e20a9a1d98f1521ec1f98b6403e73b275d3Erik        public static final String ENDDAY = "endDay";
18663763464e8f0df4d387ff46803e5a9c76045c85e6Erik
18673763464e8f0df4d387ff46803e5a9c76045c85e6Erik    }
18683763464e8f0df4d387ff46803e5a9c76045c85e6Erik
1869c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
1870c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Fields and helpers for querying for a list of days that contain events.
1871c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
18723763464e8f0df4d387ff46803e5a9c76045c85e6Erik    public static final class EventDays implements EventDaysColumns {
1873b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
1874c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                + "/instances/groupbyday");
1875c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String SELECTION = "selected=1";
18763763464e8f0df4d387ff46803e5a9c76045c85e6Erik
18773763464e8f0df4d387ff46803e5a9c76045c85e6Erik        /**
18783672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
18793672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
18803672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private EventDays() {}
18813672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
18823672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
1883c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Retrieves the days with events for the Julian days starting at
1884c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * "startDay" for "numDays". It returns a cursor containing startday and
1885c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * endday representing the max range of days for all events beginning on
1886c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * each startday.This is a blocking function and should not be done on
1887c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * the UI thread.
18883672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         *
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cr the ContentResolver
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param startDay the first Julian day in the range
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param numDays the number of days to load (must be at least 1)
189258644028f909ecb429b26f909bedfb62a153d4e4RoboErik         * @param projection the columns to return in the cursor
1893c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return a database cursor containing a list of start and end days for
1894c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         events
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
189658644028f909ecb429b26f909bedfb62a153d4e4RoboErik        public static final Cursor query(ContentResolver cr, int startDay, int numDays,
189758644028f909ecb429b26f909bedfb62a153d4e4RoboErik                String[] projection) {
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (numDays < 1) {
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int endDay = startDay + numDays - 1;
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri.Builder builder = CONTENT_URI.buildUpon();
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentUris.appendId(builder, startDay);
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentUris.appendId(builder, endDay);
190558644028f909ecb429b26f909bedfb62a153d4e4RoboErik            return cr.query(builder.build(), projection, SELECTION,
19063763464e8f0df4d387ff46803e5a9c76045c85e6Erik                    null /* selection args */, STARTDAY);
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1910b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface RemindersColumns {
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1912c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The event the reminder belongs to. Column name.
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (foreign key to the Events table)</P>
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The minutes prior to the event that the alarm should ring.  -1
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * specifies that we should use the default value for the system.
1920c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Column name.
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MINUTES = "minutes";
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1925c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1926c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Passing this as a minutes value will use the default reminder
1927c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * minutes.
1928c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int MINUTES_DEFAULT = -1;
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1932c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The alarm method, as set on the server. {@link #METHOD_DEFAULT},
1933bd2516165e4d38f1ee7f7f0ceb038ebf7ea1b84aAlon Albert         * {@link #METHOD_ALERT}, {@link #METHOD_EMAIL}, {@link #METHOD_SMS} and
1934bd2516165e4d38f1ee7f7f0ceb038ebf7ea1b84aAlon Albert         * {@link #METHOD_ALARM} are possible values; the device will only
1935bd2516165e4d38f1ee7f7f0ceb038ebf7ea1b84aAlon Albert         * process {@link #METHOD_DEFAULT} and {@link #METHOD_ALERT} reminders
1936bd2516165e4d38f1ee7f7f0ceb038ebf7ea1b84aAlon Albert         * (the other types are simply stored so we can send the same reminder
1937bd2516165e4d38f1ee7f7f0ceb038ebf7ea1b84aAlon Albert         * info back to the server when we make changes).
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String METHOD = "method";
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int METHOD_DEFAULT = 0;
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int METHOD_ALERT = 1;
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int METHOD_EMAIL = 2;
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int METHOD_SMS = 3;
1945bd2516165e4d38f1ee7f7f0ceb038ebf7ea1b84aAlon Albert        public static final int METHOD_ALARM = 4;
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1948c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
19493771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * Fields and helpers for accessing reminders for an event. Each row of this
19503771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * table represents a single reminder for an event. Calling
195158644028f909ecb429b26f909bedfb62a153d4e4RoboErik     * {@link #query(ContentResolver, long, String[])} will return a list of reminders for
19523771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * the event with the given eventId. Both apps and sync adapters may write
19533771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * to this table. There are three writable fields and all of them must be
19543771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * included when inserting a new reminder. They are:
19553771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <ul>
19563771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #EVENT_ID}</li>
19573771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #MINUTES}</li>
19583771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #METHOD}</li>
19593771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * </ul>
1960c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class Reminders implements BaseColumns, RemindersColumns, EventsColumns {
1962bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik        private static final String REMINDERS_WHERE = CalendarContract.Reminders.EVENT_ID + "=?";
1963c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
1964a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/reminders");
1965c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik
1966c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
19673672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
19683672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
19693672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Reminders() {}
19703672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
19713672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
1972c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Queries all reminders associated with the given event. This is a
1973c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * blocking call and should not be done on the UI thread.
19743672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         *
1975c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cr The content resolver to use for the query
1976c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param eventId The id of the event to retrieve reminders for
197758644028f909ecb429b26f909bedfb62a153d4e4RoboErik         * @param projection the columns to return in the cursor
1978c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return A Cursor containing all reminders for the event
1979c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
198058644028f909ecb429b26f909bedfb62a153d4e4RoboErik        public static final Cursor query(ContentResolver cr, long eventId, String[] projection) {
1981c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            String[] remArgs = {Long.toString(eventId)};
198258644028f909ecb429b26f909bedfb62a153d4e4RoboErik            return cr.query(CONTENT_URI, projection, REMINDERS_WHERE, remArgs /*selection args*/,
1983c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                    null /* sort order */);
1984c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        }
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1987b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface CalendarAlertsColumns {
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1989c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The event that the alert belongs to. Column name.
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (foreign key to the Events table)</P>
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1995c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The start time of the event, in UTC. Column name.
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String BEGIN = "begin";
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2001c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The end time of the event, in UTC. Column name.
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String END = "end";
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2007c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The alarm time of the event, in UTC. Column name.
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ALARM_TIME = "alarmTime";
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The creation time of this database entry, in UTC.
2014c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Useful for debugging missed reminders. Column name.
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CREATION_TIME = "creationTime";
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The time that the alarm broadcast was received by the Calendar app,
2021c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * in UTC. Useful for debugging missed reminders. Column name.
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String RECEIVED_TIME = "receivedTime";
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The time that the notification was created by the Calendar app,
2028c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * in UTC. Useful for debugging missed reminders. Column name.
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NOTIFY_TIME = "notifyTime";
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2034083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * The state of this alert. It starts out as {@link #STATE_SCHEDULED}, then
2035083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * when the alarm goes off, it changes to {@link #STATE_FIRED}, and then when
2036083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * the user dismisses the alarm it changes to {@link #STATE_DISMISSED}. Column
2037c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * name.
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String STATE = "state";
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2042083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        /**
2043083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * An alert begins in this state when it is first created.
2044083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         */
2045083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final int STATE_SCHEDULED = 0;
2046083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        /**
2047083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * After a notification for an alert has been created it should be
2048083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * updated to fired.
2049083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         */
2050083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final int STATE_FIRED = 1;
2051083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        /**
2052083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * Once the user has dismissed the notification the alert's state should
2053083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * be set to dismissed so it is not fired again.
2054083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         */
2055083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final int STATE_DISMISSED = 2;
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2058c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The number of minutes that this alarm precedes the start time. Column
2059c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * name.
2060c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER</P>
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MINUTES = "minutes";
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2065c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The default sort order for this alerts queries
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2067cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan        public static final String DEFAULT_SORT_ORDER = "begin ASC,title ASC";
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2070c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
2071c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Fields and helpers for accessing calendar alerts information. These
20723771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * fields are for tracking which alerts have been fired. Scheduled alarms
2073e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik     * will generate an intent using {@link #ACTION_EVENT_REMINDER}. Apps that
20743771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * receive this action may update the {@link #STATE} for the reminder when
20753771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * they have finished handling it. Apps that have their notifications
20763771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * disabled should not modify the table to ensure that they do not conflict
20773771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * with another app that is generating a notification. In general, apps
20783771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * should not need to write to this table directly except to update the
20793771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * state of a reminder.
2080c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class CalendarAlerts implements BaseColumns,
2082e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            CalendarAlertsColumns, EventsColumns, CalendarColumns {
20831dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
2084c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
2085c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @hide
2086c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String TABLE_NAME = "CalendarAlerts";
2088c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
2089c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Uri for querying calendar alert information
2090c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
2091c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
2092a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
2093a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                "/calendar_alerts");
20945b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
20953672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
20963672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
20973672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
20983672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private CalendarAlerts() {}
20993672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
21001dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        private static final String WHERE_ALARM_EXISTS = EVENT_ID + "=?"
21011dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + BEGIN + "=?"
21021dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + ALARM_TIME + "=?";
21031dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
21041dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        private static final String WHERE_FINDNEXTALARMTIME = ALARM_TIME + ">=?";
21051dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        private static final String SORT_ORDER_ALARMTIME_ASC = ALARM_TIME + " ASC";
21061dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
2107083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        private static final String WHERE_RESCHEDULE_MISSED_ALARMS = STATE + "=" + STATE_SCHEDULED
21081dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + ALARM_TIME + "<?"
21091dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + ALARM_TIME + ">?"
21101dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + END + ">=?";
21111dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This URI is for grouping the query results by event_id and begin
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * time.  This will return one result per instance of an event.  So
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * events with multiple alarms will appear just once, but multiple
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * instances of a repeating event will show up multiple times.
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21185b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff        public static final Uri CONTENT_URI_BY_INSTANCE =
2119a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff            Uri.parse("content://" + AUTHORITY + "/calendar_alerts/by_instance");
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2121083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        private static final boolean DEBUG = false;
2122cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2123c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
2124083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * Helper for inserting an alarm time associated with an event TODO move
2125083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * to Provider
2126c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
2127c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @hide
2128c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri insert(ContentResolver cr, long eventId,
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long begin, long end, long alarmTime, int minutes) {
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentValues values = new ContentValues();
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.EVENT_ID, eventId);
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.BEGIN, begin);
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.END, end);
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.ALARM_TIME, alarmTime);
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long currentTime = System.currentTimeMillis();
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.CREATION_TIME, currentTime);
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.RECEIVED_TIME, 0);
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.NOTIFY_TIME, 0);
2140083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik            values.put(CalendarAlerts.STATE, STATE_SCHEDULED);
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.MINUTES, minutes);
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cr.insert(CONTENT_URI, values);
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2145c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Finds the next alarm after (or equal to) the given time and returns
2147c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * the time of that alarm or -1 if no such alarm exists. This is a
2148083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * blocking call and should not be done on the UI thread. TODO move to
2149083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * provider
21505b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff         *
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cr the ContentResolver
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param millis the time in UTC milliseconds
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return the next alarm time greater than or equal to "millis", or -1
2154c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         if no such alarm exists.
2155083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final long findNextAlarmTime(ContentResolver cr, long millis) {
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String selection = ALARM_TIME + ">=" + millis;
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: construct an explicit SQL query so that we can add
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // "LIMIT 1" to the end and get just one result.
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] projection = new String[] { ALARM_TIME };
2162083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik            Cursor cursor = cr.query(CONTENT_URI, projection, WHERE_FINDNEXTALARMTIME,
2163083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    (new String[] {
21641dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                        Long.toString(millis)
2165083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    }), SORT_ORDER_ALARMTIME_ASC);
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long alarmTime = -1;
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cursor != null && cursor.moveToFirst()) {
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    alarmTime = cursor.getLong(0);
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cursor != null) {
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cursor.close();
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return alarmTime;
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21785b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Searches the CalendarAlerts table for alarms that should have fired
2181083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * but have not and then reschedules them. This method can be called at
2182083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * boot time to restore alarms that may have been lost due to a phone
2183083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * reboot. TODO move to provider
21845b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff         *
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cr the ContentResolver
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param context the Context
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param manager the AlarmManager
2188083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final void rescheduleMissedAlarms(ContentResolver cr,
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Context context, AlarmManager manager) {
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Get all the alerts that have been scheduled but have not fired
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // and should have fired by now and are not too old.
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long now = System.currentTimeMillis();
2195cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            long ancient = now - DateUtils.DAY_IN_MILLIS;
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] projection = new String[] {
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ALARM_TIME,
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
2199cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2200cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            // TODO: construct an explicit SQL query so that we can add
2201cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            // "GROUPBY" instead of doing a sort and de-dup
2202083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik            Cursor cursor = cr.query(CalendarAlerts.CONTENT_URI, projection,
2203083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    WHERE_RESCHEDULE_MISSED_ALARMS, (new String[] {
2204083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                            Long.toString(now), Long.toString(ancient), Long.toString(now)
2205083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    }), SORT_ORDER_ALARMTIME_ASC);
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cursor == null) {
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2209cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2210cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            if (DEBUG) {
2211105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                Log.d(TAG, "missed alarms found: " + cursor.getCount());
2212105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
22135b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
2215cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                long alarmTime = -1;
2216cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (cursor.moveToNext()) {
2218cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                    long newAlarmTime = cursor.getLong(0);
2219cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                    if (alarmTime != newAlarmTime) {
2220cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                        if (DEBUG) {
2221cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                            Log.w(TAG, "rescheduling missed alarm. alarmTime: " + newAlarmTime);
2222cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                        }
2223cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                        scheduleAlarm(context, manager, newAlarmTime);
2224cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                        alarmTime = newAlarmTime;
2225cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                    }
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cursor.close();
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2230cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan        }
2231cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2232c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
2233c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Schedules an alarm intent with the system AlarmManager that will
22343771fcbc192386d96b57d1edec44d53620d9f09dRoboErik         * notify listeners when a reminder should be fired. The provider will
22353771fcbc192386d96b57d1edec44d53620d9f09dRoboErik         * keep scheduled reminders up to date but apps may use this to
22363771fcbc192386d96b57d1edec44d53620d9f09dRoboErik         * implement snooze functionality without modifying the reminders table.
22373771fcbc192386d96b57d1edec44d53620d9f09dRoboErik         * Scheduled alarms will generate an intent using
2238083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * {@link #ACTION_EVENT_REMINDER}. TODO Move to provider
2239c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
2240c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param context A context for referencing system resources
2241c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param manager The AlarmManager to use or null
2242c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param alarmTime The time to fire the intent in UTC millis since
2243c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
2244083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
2245c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
2246cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan        public static void scheduleAlarm(Context context, AlarmManager manager, long alarmTime) {
2247cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            if (DEBUG) {
2248cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                Time time = new Time();
2249cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                time.set(alarmTime);
2250cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                String schedTime = time.format(" %a, %b %d, %Y %I:%M%P");
2251cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                Log.d(TAG, "Schedule alarm at " + alarmTime + " " + schedTime);
2252cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            }
2253cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2254cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            if (manager == null) {
2255cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
2256cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            }
22575b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
2258e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            Intent intent = new Intent(ACTION_EVENT_REMINDER);
2259bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik            intent.setData(ContentUris.withAppendedId(CalendarContract.CONTENT_URI, alarmTime));
22601dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio            intent.putExtra(ALARM_TIME, alarmTime);
226142f1957817c3bda0c002e2c987f2a8bbe320f755Erik            PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
2262cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            manager.set(AlarmManager.RTC_WAKEUP, alarmTime, pi);
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22645b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2266083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * Searches for an entry in the CalendarAlerts table that matches the
2267083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * given event id, begin time and alarm time. If one is found then this
2268083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * alarm already exists and this method returns true. TODO Move to
2269083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * provider
227058644028f909ecb429b26f909bedfb62a153d4e4RoboErik         *
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cr the ContentResolver
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param eventId the event id to match
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param begin the start time of the event in UTC millis
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param alarmTime the alarm time of the event in UTC millis
2275083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @return true if there is already an alarm for the given event with
2276083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         *         the same start time and alarm time.
2277083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final boolean alarmExists(ContentResolver cr, long eventId,
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long begin, long alarmTime) {
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: construct an explicit SQL query so that we can add
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // "LIMIT 1" to the end and get just one result.
22831dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio            String[] projection = new String[] { ALARM_TIME };
2284083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik            Cursor cursor = cr.query(CONTENT_URI, projection, WHERE_ALARM_EXISTS,
2285083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    (new String[] {
2286083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                            Long.toString(eventId), Long.toString(begin), Long.toString(alarmTime)
2287083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    }), null);
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean found = false;
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cursor != null && cursor.getCount() > 0) {
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    found = true;
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cursor != null) {
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cursor.close();
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return found;
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2302f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik    protected interface ColorsColumns extends SyncStateContract.Columns {
2303f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2304f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2305f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * The type of color, which describes how it should be used. Valid types
2306f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * are {@link #TYPE_CALENDAR} and {@link #TYPE_EVENT}. Column name.
2307f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>
2308f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * Type: INTEGER (NOT NULL)
2309f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * </P>
2310f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2311f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final String COLOR_TYPE = "color_type";
2312f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2313f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2314f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * This indicateds a color that can be used for calendars.
2315f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2316f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final int TYPE_CALENDAR = 0;
2317f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2318f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * This indicates a color that can be used for events.
2319f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2320f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final int TYPE_EVENT = 1;
2321f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2322f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
23234172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik         * The key used to reference this color. This can be any non-empty
2324f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * string, but must be unique for a given {@link #ACCOUNT_TYPE} and
23258a8eebcbe8e3aded682c9c4937e155218ddf7ff4RoboErik         * {@link #ACCOUNT_NAME}. Column name.
2326f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>
2327f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * Type: TEXT
2328f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * </P>
2329f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
23304172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik        public static final String COLOR_KEY = "color_index";
2331f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2332f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
233305b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik         * The color as an 8-bit ARGB integer value. Colors should specify alpha
233405b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik         * as fully opaque (eg 0xFF993322) as the alpha may be ignored or
233505b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik         * modified for display. It is reccomended that colors be usable with
233605b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik         * light (near white) text. Apps should not depend on that assumption,
233705b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik         * however. Column name.
2338f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * <P>
2339f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * Type: INTEGER (NOT NULL)
2340f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * </P>
2341f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
234205b36e5f3c6618420bda3a0eef818e6838efb0feRoboErik        public static final String COLOR = "color";
2343f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2344f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik    }
2345f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2346f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik    /**
2347f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     * Fields for accessing colors available for a given account. Colors are
23484172d95a6726efd5f03517e1a2a6fbbe879f1d74RoboErik     * referenced by {@link #COLOR_KEY} which must be unique for a given
23490c559c6c575e3415788cb08d374df3b4937b99b0RoboErik     * account name/type. These values can only be updated by the sync
23508a8eebcbe8e3aded682c9c4937e155218ddf7ff4RoboErik     * adapter. Only {@link #COLOR} may be updated after the initial insert. In
23518a8eebcbe8e3aded682c9c4937e155218ddf7ff4RoboErik     * addition, a row can only be deleted once all references to that color
23528a8eebcbe8e3aded682c9c4937e155218ddf7ff4RoboErik     * have been removed from the {@link Calendars} or {@link Events} tables.
2353f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik     */
2354f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik    public static final class Colors implements ColorsColumns {
2355f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2356f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * @hide
2357f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2358f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final String TABLE_NAME = "Colors";
2359f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2360f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * The Uri for querying color information
2361f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2362f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        @SuppressWarnings("hiding")
2363f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/colors");
2364f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2365f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        /**
2366f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         * This utility class cannot be instantiated
2367f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik         */
2368f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        private Colors() {
2369f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik        }
2370f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik    }
2371f8143c5d0734b7b9c888c936a0c30df4b5d46021RoboErik
2372b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface ExtendedPropertiesColumns {
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2374c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The event the extended property belongs to. Column name.
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (foreign key to the Events table)</P>
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The name of the extended property.  This is a uri of the form
2381c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * {scheme}#{local-name} convention. Column name.
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NAME = "name";
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2387c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The value of the extended property. Column name.
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String VALUE = "value";
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2393c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
2394c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Fields for accessing the Extended Properties. This is a generic set of
239573bddfcdd3ba50d30aca9df0f394d15bc7932b6aMichael Chan     * name/value pairs for use by sync adapters to add extra
23963771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * information to events. There are three writable columns and all three
23973771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * must be present when inserting a new value. They are:
23983771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <ul>
23993771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #EVENT_ID}</li>
24003771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #NAME}</li>
24013771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #VALUE}</li>
24023771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * </ul>
2403c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   public static final class ExtendedProperties implements BaseColumns,
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ExtendedPropertiesColumns, EventsColumns {
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri CONTENT_URI =
2407a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                Uri.parse("content://" + AUTHORITY + "/extendedproperties");
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24093672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
24103672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
24113672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
24123672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private ExtendedProperties() {}
24133672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: fill out this class when we actually start utilizing extendedproperties
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // in the calendar application.
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   }
2417ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff
2418ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff    /**
2419ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff     * A table provided for sync adapters to use for storing private sync state data.
2420ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff     *
2421ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff     * @see SyncStateContract
2422ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff     */
2423ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff    public static final class SyncState implements SyncStateContract.Columns {
2424ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff        /**
2425ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff         * This utility class cannot be instantiated
2426ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff         */
2427ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff        private SyncState() {}
2428ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff
2429c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String CONTENT_DIRECTORY =
2430ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff                SyncStateContract.Constants.CONTENT_DIRECTORY;
2431ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff
2432ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff        /**
2433ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff         * The content:// style URI for this table
2434ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff         */
2435ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff        public static final Uri CONTENT_URI =
2436bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik                Uri.withAppendedPath(CalendarContract.CONTENT_URI, CONTENT_DIRECTORY);
2437ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff    }
2438505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2439505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    /**
2440505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio     * Columns from the EventsRawTimes table
24413771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     *
24423771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * @hide
2443505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio     */
2444b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface EventsRawTimesColumns {
2445505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2446c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The corresponding event id. Column name.
2447505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: INTEGER (long)</P>
2448505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2449505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String EVENT_ID = "event_id";
2450505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2451505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2452c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The RFC2445 compliant time the event starts. Column name.
2453505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: TEXT</P>
2454505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2455505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String DTSTART_2445 = "dtstart2445";
2456505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2457505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2458c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The RFC2445 compliant time the event ends. Column name.
2459505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: TEXT</P>
2460505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2461505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String DTEND_2445 = "dtend2445";
2462505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2463505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2464c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The RFC2445 compliant original instance time of the recurring event
2465c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * for which this event is an exception. Column name.
2466505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: TEXT</P>
2467505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2468505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String ORIGINAL_INSTANCE_TIME_2445 = "originalInstanceTime2445";
2469505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2470505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2471c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The RFC2445 compliant last date this event repeats on, or NULL if it
2472c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * never ends. Column name.
2473505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: TEXT</P>
2474505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2475505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String LAST_DATE_2445 = "lastDate2445";
2476505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    }
2477505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2478c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
2479c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * @hide
2480c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
2481505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    public static final class EventsRawTimes implements BaseColumns, EventsRawTimesColumns {
24823672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
24833672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
24843672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
24853672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
24863672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private EventsRawTimes() {}
2487505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    }
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2489