CalendarContract.java revision e5e0250dd23d0ff718a26350f3076884235b8c0e
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.provider;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik
203672696dc542674f8b54f83cd00c616b4a9fd4adRoboErikimport android.annotation.SdkConstant;
213672696dc542674f8b54f83cd00c616b4a9fd4adRoboErikimport android.annotation.SdkConstant.SdkConstantType;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.AlarmManager;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent;
2464a556d755d27b1182897e9243cf4f3016e76a88Marc Blankimport android.content.ContentProviderClient;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentUris;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
29328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintanaimport android.content.CursorEntityIterator;
30328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintanaimport android.content.Entity;
3164a556d755d27b1182897e9243cf4f3016e76a88Marc Blankimport android.content.EntityIterator;
3264a556d755d27b1182897e9243cf4f3016e76a88Marc Blankimport android.content.Intent;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
34328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintanaimport android.database.DatabaseUtils;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
36cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chanimport android.os.RemoteException;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.format.DateUtils;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.format.Time;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
42260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <p>
43260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * The contract between the calendar provider and applications. Contains
44260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * definitions for the supported URIs and data columns.
45260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </p>
46260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <h3>Overview</h3>
47260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <p>
48260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * CalendarContract defines the data model of calendar and event related
49260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * information. This data is stored in a number of tables:
50260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </p>
51260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <ul>
52260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Calendars} table holds the calendar specific information. Each
53260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * row in this table contains the details for a single calendar, such as the
54260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * name, color, sync info, etc.</li>
55260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Events} table holds the event specific information. Each row
56260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * in this table has the info for a single event. It contains information such
57260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * as event title, location, start time, end time, etc. The event can occur
58260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * one-time or can recur multiple times. Attendees, reminders, and extended
59260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * properties are stored on separate tables and reference the {@link Events#_ID}
60260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * to link them with the event.</li>
61260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Instances} table holds the start and end time for occurrences
62260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * of an event. Each row in this table represents a single occurrence. For
63260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * one-time events there will be a 1:1 mapping of instances to events. For
64260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * recurring events, multiple rows will automatically be generated which
65260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * correspond to multiple occurrences of that event.</li>
66260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Attendees} table holds the event attendee or guest
67260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * information. Each row represents a single guest of an event. It specifies the
68260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * type of guest they are and their attendance response for the event.</li>
69260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Reminders} table holds the alert/notification data. Each row
70260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * represents a single alert for an event. An event can have multiple reminders.
71260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * The number of reminders per event is specified in
72260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * {@link Calendars#MAX_REMINDERS} which is set by the Sync Adapter that owns
73260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * the given calendar. Reminders are specified in minutes before the event and
74260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * have a type.</li>
75260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link ExtendedProperties} table hold opaque data fields used by the
76260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * sync adapter. The provider takes no action with items in this table except to
77260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * delete them when their related events are deleted.</li>
78260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </ul>
79260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <p>
80260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * Other tables include:
81260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </p>
82260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <ul>
83260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>
84260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * {@link SyncState}, which contains free-form data maintained by the sync
85260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * adapters</li>
86260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </ul>
87bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik *
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
89bec6c36b96f7bc415af18abbb142bd51a1741796RoboErikpublic final class CalendarContract {
90c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    private static final String TAG = "Calendar";
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
93c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Broadcast Action: This is the intent that gets fired when an alarm
94c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * notification needs to be posted for a reminder.
95083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     *
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
973672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
98e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik    public static final String ACTION_EVENT_REMINDER = "android.intent.action.EVENT_REMINDER";
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
101c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Intent Extras key: The start time of an event or an instance of a
102c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * recurring event. (milliseconds since epoch)
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
104e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik    public static final String EXTRA_EVENT_BEGIN_TIME = "beginTime";
105c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik
106c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
107c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Intent Extras key: The end time of an event or an instance of a recurring
108c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * event. (milliseconds since epoch)
109c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
110e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik    public static final String EXTRA_EVENT_END_TIME = "endTime";
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
112e9b734dff148d8e70a9604c81d162144becdc45dErik    /**
1137420f1339446cd76723d57b3c5c1bbc92f15f4f0Michael Chan     * Intent Extras key: When creating an event, set this to true to create an
1147420f1339446cd76723d57b3c5c1bbc92f15f4f0Michael Chan     * all-day event by default
1157420f1339446cd76723d57b3c5c1bbc92f15f4f0Michael Chan     */
1167420f1339446cd76723d57b3c5c1bbc92f15f4f0Michael Chan    public static final String EXTRA_EVENT_ALL_DAY = "allDay";
1177420f1339446cd76723d57b3c5c1bbc92f15f4f0Michael Chan
1187420f1339446cd76723d57b3c5c1bbc92f15f4f0Michael Chan    /**
119c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * This authority is used for writing to or querying from the calendar
120c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * provider. Note: This is set at first run and cannot be changed without
121c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * breaking apps that access the provider.
122e9b734dff148d8e70a9604c81d162144becdc45dErik     */
1231790c13ed68a3fc1f8d91d636caae422a19b1a2aKen Shirriff    public static final String AUTHORITY = "com.android.calendar";
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The content:// style URL for the top-level calendar authority
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
128083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1315b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff     * An optional insert, update or delete URI parameter that allows the caller
132c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * to specify that it is a sync adapter. The default value is false. If set
133c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * to true, the modified row is not marked as "dirty" (needs to be synced)
134c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * and when the provider calls
135c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * {@link ContentResolver#notifyChange(android.net.Uri, android.database.ContentObserver, boolean)}
136c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * , the third parameter "syncToNetwork" is set to false. Furthermore, if
137c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * set to true, the caller must also include
1386f5b4550450d98bb2ae4ac93cefd4133e2a71847Andy McFadden     * {@link Calendars#ACCOUNT_NAME} and {@link Calendars#ACCOUNT_TYPE} as
139c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * query parameters.
140c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     *
1416f5b4550450d98bb2ae4ac93cefd4133e2a71847Andy McFadden     * @see Uri.Builder#appendQueryParameter(java.lang.String, java.lang.String)
1425b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff     */
1435b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff    public static final String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter";
1445b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
145c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
146c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * A special account type for calendars not associated with any account.
147c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Normally calendars that do not match an account on the device will be
148c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * removed. Setting the account_type on a calendar to this will prevent it
149c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * from being wiped if it does not match an existing account.
150c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     *
151c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * @see SyncColumns#ACCOUNT_TYPE
152c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
153c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    public static final String ACCOUNT_TYPE_LOCAL = "LOCAL";
154c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
1555b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff    /**
1563672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik     * This utility class cannot be instantiated
1573672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik     */
1583672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    private CalendarContract() {}
1593672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
1603672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    /**
161c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Generic columns for use by sync adapters. The specific functions of these
162c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * columns are private to the sync adapter. Other clients of the API should
163c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * not attempt to either read or write this column. These columns are
164c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * editable as part of the Calendars Uri, but can only be read if accessed
165c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * through any other Uri.
16636f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio     */
167c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    protected interface CalendarSyncColumns {
16836f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio
1699734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
1709734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
1719734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
1729734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
1739734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
174be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik        public static final String CAL_SYNC1 = "cal_sync1";
1759734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
1769734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
1779734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
1789734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
1799734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
180be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik        public static final String CAL_SYNC2 = "cal_sync2";
1819734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
1829734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
1839734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
1849734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
1859734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
186be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik        public static final String CAL_SYNC3 = "cal_sync3";
1879734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
1889734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
1899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
1909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
1919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
192be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik        public static final String CAL_SYNC4 = "cal_sync4";
1939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
1949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
1959734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
1969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
1979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
198be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik        public static final String CAL_SYNC5 = "cal_sync5";
1999734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
2009734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
2019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
2029734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
2039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
204be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik        public static final String CAL_SYNC6 = "cal_sync6";
2059734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
2069734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
2079734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
2089734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
2099734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
2109734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAL_SYNC7 = "cal_sync7";
2119734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
2129734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
2139734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
2149734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
2159734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
2169734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAL_SYNC8 = "cal_sync8";
2179734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
2189734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
2199734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
2209734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
2219734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
2229734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAL_SYNC9 = "cal_sync9";
2239734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
2249734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
2259734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Generic column for use by sync adapters. Column name.
2269734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
2279734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
2289734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAL_SYNC10 = "cal_sync10";
22936f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio    }
23036f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio
23136f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio    /**
232c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Columns for Sync information used by Calendars and Events tables. These
233c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * have specific uses which are expected to be consistent by the app and
234c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * sync adapter.
235c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     *
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2370025860b61c1b9e8e7d1da7edd7a8ad837b87078RoboErik    protected interface SyncColumns extends CalendarSyncColumns {
238328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
239c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The account that was used to sync the entry to the device. If the
240c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * account_type is not {@link #ACCOUNT_TYPE_LOCAL} then the name and
241c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * type must match an account on the device or the calendar will be
242c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * deleted.
243328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         * <P>Type: TEXT</P>
244328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
245651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String ACCOUNT_NAME = "account_name";
246328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
247328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
248c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The type of the account that was used to sync the entry to the
249c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * device. A type of {@link #ACCOUNT_TYPE_LOCAL} will keep this event
250c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * form being deleted if there are no matching accounts on the device.
251328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         * <P>Type: TEXT</P>
252328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
253651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String ACCOUNT_TYPE = "account_type";
254328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
255328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
256c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The unique ID for a row assigned by the sync source. NULL if the row
257c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * has never been synced. This is used as a reference id for exceptions
258c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * along with {@link BaseColumns#_ID}.
259328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         * <P>Type: TEXT</P>
260328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
261328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        public static final String _SYNC_ID = "_sync_id";
262328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
263328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
2649734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Used to indicate that local, unsynced, changes are present.
265328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         * <P>Type: INTEGER (long)</P>
266328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
2679734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String DIRTY = "dirty";
268328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
269328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
2709734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Whether the row has been deleted but not synced to the server. A
2719734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * deleted row should be ignored.
2729734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>
2739734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Type: INTEGER (boolean)
2749734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * </P>
275328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
2769734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String DELETED = "deleted";
27715049e46f7331b64bd3093e1d9a0365ca5caf3aeKen Shirriff
278866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        /**
279866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * If set to 1 this causes events on this calendar to be duplicated with
2800025860b61c1b9e8e7d1da7edd7a8ad837b87078RoboErik         * {@link Events#LAST_SYNCED} set to 1 whenever the event
2819734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * transitions from non-dirty to dirty. The duplicated event will not be
2829734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * expanded in the instances table and will only show up in sync adapter
2839734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * queries of the events table. It will also be deleted when the
284866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * originating event has its dirty flag cleared by the sync adapter.
285866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * <P>Type: INTEGER (boolean)</P>
286866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         */
287866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        public static final String CAN_PARTIALLY_UPDATE = "canPartiallyUpdate";
288c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    }
289c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
290c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    /**
291c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Columns specific to the Calendars Uri that other Uris can query.
292c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     */
293e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik    protected interface CalendarColumns {
294c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
295c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * The color of the calendar
296c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: INTEGER (color value)</P>
297c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
298651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String CALENDAR_COLOR = "calendar_color";
299c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
300c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
3019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * The display name of the calendar. Column name.
3029734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
3039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
3049734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CALENDAR_DISPLAY_NAME = "calendar_displayName";
3059734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
3069734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
307c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * The level of access that the user has for the calendar
308c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: INTEGER (one of the values below)</P>
309c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
3109734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CALENDAR_ACCESS_LEVEL = "calendar_access_level";
311c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
312c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Cannot access the calendar */
3139734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_NONE = 0;
314c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Can only see free/busy information about the calendar */
3159734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_FREEBUSY = 100;
316c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Can read all event details */
3179734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_READ = 200;
318c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /** Can reply yes/no/maybe to an event */
3199734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_RESPOND = 300;
320c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /** not used */
3219734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_OVERRIDE = 400;
322c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /** Full access to modify the calendar, but not the access control
323c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * settings
324c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
3259734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_CONTRIBUTOR = 500;
326c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /** Full access to modify the calendar, but not the access control
327c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * settings
328c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
3299734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_EDITOR = 600;
330c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Full access to the calendar */
3319734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_OWNER = 700;
332c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /** Domain admin */
3339734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final int CAL_ACCESS_ROOT = 800;
334c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
335c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
336c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * Is the calendar selected to be displayed?
337c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * 0 - do not show events associated with this calendar.
338c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * 1 - show events associated with this calendar
339c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: INTEGER (boolean)</P>
340c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
341df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden        public static final String VISIBLE = "visible";
342c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
343c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
344c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The time zone the calendar is associated with.
345c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: TEXT</P>
346c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
3479734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CALENDAR_TIME_ZONE = "calendar_timezone";
348c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
349c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
350c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Is this calendar synced and are its events stored on the device?
351c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * 0 - Do not sync this calendar or store events for this calendar.
352c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * 1 - Sync down events for this calendar.
353c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <p>Type: INTEGER (boolean)</p>
354c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
355c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        public static final String SYNC_EVENTS = "sync_events";
356c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
357c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
3589734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * The owner account for this calendar, based on the calendar feed.
3599734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This will be different from the _SYNC_ACCOUNT for delegated calendars.
3609734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Column name.
3619734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: String</P>
362c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
3639734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String OWNER_ACCOUNT = "ownerAccount";
364c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
365c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        /**
3669734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Can the organizer respond to the event?  If no, the status of the
3679734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * organizer should not be shown by the UI.  Defaults to 1. Column name.
368c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         * <P>Type: INTEGER (boolean)</P>
369c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio         */
3709734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAN_ORGANIZER_RESPOND = "canOrganizerRespond";
3719734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
3729734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
3739734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * Can the organizer modify the time zone of the event? Column name.
3749734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: INTEGER (boolean)</P>
3759734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        */
3769734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String CAN_MODIFY_TIME_ZONE = "canModifyTimeZone";
3779734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
3789734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
3799734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * The maximum number of reminders allowed for an event. Column name.
3809734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: INTEGER</P>
3819734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
3829734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String MAX_REMINDERS = "maxReminders";
3839734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
3849734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
3859734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * A comma separated list of reminder methods supported for this
3869734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * calendar in the format "#,#,#". Valid types are
3879734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * {@link Reminders#METHOD_DEFAULT}, {@link Reminders#METHOD_ALERT},
3889734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * {@link Reminders#METHOD_EMAIL}, {@link Reminders#METHOD_SMS}. Column
3899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * name.
3909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
3919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
3929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String ALLOWED_REMINDERS = "allowedReminders";
393c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    }
394c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
395c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    /**
396c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     * Class that represents a Calendar Entity. There is one entry per calendar.
397c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * This is a helper class to make batch operations easier.
398c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     */
3993672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    public static final class CalendarEntity implements BaseColumns, SyncColumns, CalendarColumns {
400c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
401c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
402c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The default Uri used when creating a new calendar EntityIterator.
403c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
404c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
405c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
406c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                "/calendar_entities");
407c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
408c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
4093672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
4103672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
4113672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private CalendarEntity() {}
4123672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
4133672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
414c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Creates an entity iterator for the given cursor. It assumes the
415c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * cursor contains a calendars query.
416c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
417c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cursor query on {@link #CONTENT_URI}
418c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return an EntityIterator of calendars
419c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
420c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        public static EntityIterator newEntityIterator(Cursor cursor) {
421c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            return new EntityIteratorImpl(cursor);
422c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        }
423c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
424c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        private static class EntityIteratorImpl extends CursorEntityIterator {
425c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
426c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            public EntityIteratorImpl(Cursor cursor) {
427c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                super(cursor);
428c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio            }
429c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
430c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio            @Override
431c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio            public Entity getEntityAndIncrementCursor(Cursor cursor) throws RemoteException {
432c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // we expect the cursor is already at the row we need to read from
433c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                final long calendarId = cursor.getLong(cursor.getColumnIndexOrThrow(_ID));
434c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
435c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // Create the content value
436c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                ContentValues cv = new ContentValues();
437c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                cv.put(_ID, calendarId);
438c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
439651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ACCOUNT_NAME);
440651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ACCOUNT_TYPE);
441c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
442c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_ID);
443651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DIRTY);
444c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
4459734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC1);
4469734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC2);
4479734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC3);
4489734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC4);
4499734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC5);
4509734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC6);
4519734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC7);
4529734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC8);
4539734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC9);
4549734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC10);
455c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
456c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, Calendars.NAME);
457c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
4589734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                        Calendars.CALENDAR_DISPLAY_NAME);
459866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
460866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                        Calendars.CALENDAR_COLOR);
4619734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, CALENDAR_ACCESS_LEVEL);
462df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, VISIBLE);
463c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, SYNC_EVENTS);
464651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
465651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                        Calendars.CALENDAR_LOCATION);
4669734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CALENDAR_TIME_ZONE);
467c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
468c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                        Calendars.OWNER_ACCOUNT);
469c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
470df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                        Calendars.CAN_ORGANIZER_RESPOND);
471df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
472df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                        Calendars.CAN_MODIFY_TIME_ZONE);
473df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
474df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden                        Calendars.MAX_REMINDERS);
475866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
476866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                        Calendars.CAN_PARTIALLY_UPDATE);
4779734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
4789734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                        Calendars.ALLOWED_REMINDERS);
479c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
480c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, DELETED);
481c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
482c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // Create the Entity from the ContentValue
483c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                Entity entity = new Entity(cv);
484c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
485c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // Set cursor to next row
486c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                cursor.moveToNext();
487c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
488c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                // Return the created Entity
489c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio                return entity;
490c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio            }
491c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio        }
492c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     }
493c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio
494c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    /**
495f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * Constants and helpers for the Calendars table, which contains details for
496f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * individual calendars. <h3>Operations</h3> All operations can be done
497f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * either as an app or as a sync adapter. To perform an operation as a sync
498f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * adapter {@link #CALLER_IS_SYNCADAPTER} should be set to true and
499f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #ACCOUNT_NAME} and {@link #ACCOUNT_TYPE} must be set in the Uri
500f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * parameters. See
501f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link Uri.Builder#appendQueryParameter(java.lang.String, java.lang.String)}
502f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * for details on adding parameters. Sync adapters have write access to more
503f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * columns but are restricted to a single account at a time. Calendars are
504f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * designed to be primarily managed by a sync adapter and inserting new
505f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * calendars should be done as a sync adapter. For the most part, apps
506f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * should only update calendars (such as changing the color or display
507f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * name). If a local calendar is required an app can do so by inserting as a
508f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * sync adapter and using an {@link #ACCOUNT_TYPE} of
509f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #ACCOUNT_TYPE_LOCAL} .
510f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dl>
511f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dt><b>Insert</b></dt>
512f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>When inserting a new calendar the following fields must be included:
513f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <ul>
514f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ACCOUNT_NAME}</li>
515f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ACCOUNT_TYPE}</li>
516f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #NAME}</li>
517f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_DISPLAY_NAME}</li>
518f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_COLOR}</li>
519f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_ACCESS_LEVEL}</li>
520f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #OWNER_ACCOUNT}</li>
521f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </ul>
522f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * The following fields are not required when inserting a Calendar but are
523f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * generally a good idea to include:
524f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <ul>
525f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #SYNC_EVENTS} set to 1</li>
526f92ccfb8b0e2062e5170ea649cdc01692b09a683RoboErik     * <li>{@link #CALENDAR_TIME_ZONE}</li>
527f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ALLOWED_REMINDERS}</li>
528f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </ul>
529f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dt><b>Update</b></dt>
530f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>To perform an update on a calendar the {@link #_ID} of the calendar
531f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * should be provided either as an appended id to the Uri (
532f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link ContentUris#withAppendedId}) or as the first selection item--the
533f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * selection should start with "_id=?" and the first selectionArg should be
534f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * the _id of the calendar. Calendars may also be updated using a selection
535f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * without the id. In general, the {@link #ACCOUNT_NAME} and
536f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #ACCOUNT_TYPE} should not be changed after a calendar is created
537f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * as this can cause issues for sync adapters.
538f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dt><b>Delete</b></dt>
539f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>Calendars can be deleted either by the {@link #_ID} as an appended id
540f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * on the Uri or using any standard selection. Deleting a calendar should
541f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * generally be handled by a sync adapter as it will remove the calendar
542f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * from the database and all associated data (aka events).</dd>
543f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dt><b>Query</b></dt>
544f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>Querying the Calendars table will get you all information about a set
545f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * of calendars. There will be one row returned for each calendar that
546f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * matches the query selection, or at most a single row if the {@link #_ID}
547f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * is appended to the Uri.</dd>
548f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </dl>
549f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <h3>Calendar Columns</h3> The following Calendar columns are writable by
550f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * both an app and a sync adapter.
551f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <ul>
552f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #NAME}</li>
553f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_DISPLAY_NAME}</li>
554f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_COLOR}</li>
555f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #VISIBLE}</li>
556f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #SYNC_EVENTS}</li>
557f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </ul>
558f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * The following Calendars columns are writable only by a sync adapter
559f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <ul>
560f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ACCOUNT_NAME}</li>
561f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ACCOUNT_TYPE}</li>
562f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #_SYNC_ID}</li>
563f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #DIRTY}</li>
564f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #OWNER_ACCOUNT}</li>
565f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #MAX_REMINDERS}</li>
566f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #ALLOWED_REMINDERS}</li>
567f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAN_MODIFY_TIME_ZONE}</li>
568f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAN_ORGANIZER_RESPOND}</li>
569f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAN_PARTIALLY_UPDATE}</li>
570f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_LOCATION}</li>
571f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_TIME_ZONE}</li>
572f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CALENDAR_ACCESS_LEVEL}</li>
573f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #DELETED}</li>
574f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC1}</li>
575f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC2}</li>
576f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC3}</li>
577f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC4}</li>
578f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC5}</li>
579f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC6}</li>
580f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC7}</li>
581f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC8}</li>
582f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC9}</li>
583f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <li>{@link #CAL_SYNC10}</li>
584f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * </ul>
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5863672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    public static final class Calendars implements BaseColumns, SyncColumns, CalendarColumns {
5873672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
5883672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
5893672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
5903672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
5913672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Calendars() {}
5923672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
594c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for accessing Calendars
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
596c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
5971dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/calendars");
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
602e5e0250dd23d0ff718a26350f3076884235b8c0eMichael Chan        public static final String DEFAULT_SORT_ORDER = CALENDAR_DISPLAY_NAME;
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
605c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The name of the calendar. Column name.
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NAME = "name";
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
611c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The default location for the calendar. Column name.
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
614651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String CALENDAR_LOCATION = "calendar_location";
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6176efb30f40a19a9639076b08df4f64d335c8946a0RoboErik         * These fields are only writable by a sync adapter. To modify them the
618c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * caller must include {@link #CALLER_IS_SYNCADAPTER},
6199734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * {@link #ACCOUNT_NAME}, and {@link #ACCOUNT_TYPE} in the Uri's query
620083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * parameters. TODO move to provider
621083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         *
622083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
6236efb30f40a19a9639076b08df4f64d335c8946a0RoboErik         */
6246efb30f40a19a9639076b08df4f64d335c8946a0RoboErik        public static final String[] SYNC_WRITABLE_COLUMNS = new String[] {
625651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            ACCOUNT_NAME,
626651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            ACCOUNT_TYPE,
6276efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            _SYNC_ID,
628651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            DIRTY,
6296efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            OWNER_ACCOUNT,
6306efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            MAX_REMINDERS,
631f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik            ALLOWED_REMINDERS,
6326efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            CAN_MODIFY_TIME_ZONE,
6336efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            CAN_ORGANIZER_RESPOND,
634866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert            CAN_PARTIALLY_UPDATE,
635651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            CALENDAR_LOCATION,
6369734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CALENDAR_TIME_ZONE,
6379734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CALENDAR_ACCESS_LEVEL,
6386efb30f40a19a9639076b08df4f64d335c8946a0RoboErik            DELETED,
639be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik            CAL_SYNC1,
640be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik            CAL_SYNC2,
641be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik            CAL_SYNC3,
642be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik            CAL_SYNC4,
643c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            CAL_SYNC5,
644c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            CAL_SYNC6,
6459734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CAL_SYNC7,
6469734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CAL_SYNC8,
6479734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CAL_SYNC9,
6489734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            CAL_SYNC10,
6496efb30f40a19a9639076b08df4f64d335c8946a0RoboErik        };
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
652c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio    /**
653c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     * Columns from the Attendees table that other tables join into themselves.
654c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio     */
655b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface AttendeesColumns {
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
658c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The id of the event. Column name.
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
664c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The name of the attendee. Column name.
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: STRING</P>
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_NAME = "attendeeName";
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
670c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The email address of the attendee. Column name.
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: STRING</P>
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_EMAIL = "attendeeEmail";
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
676c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The relationship of the attendee to the user. Column name.
677c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (one of {@link #RELATIONSHIP_ATTENDEE}, ...}.</P>
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_RELATIONSHIP = "attendeeRelationship";
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_NONE = 0;
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_ATTENDEE = 1;
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_ORGANIZER = 2;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_PERFORMER = 3;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int RELATIONSHIP_SPEAKER = 4;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
688c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The type of attendee. Column name.
689c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: Integer (one of {@link #TYPE_REQUIRED}, {@link #TYPE_OPTIONAL})</P>
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_TYPE = "attendeeType";
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TYPE_NONE = 0;
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TYPE_REQUIRED = 1;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int TYPE_OPTIONAL = 2;
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
698c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The attendance status of the attendee. Column name.
699c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: Integer (one of {@link #ATTENDEE_STATUS_ACCEPTED}, ...).</P>
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ATTENDEE_STATUS = "attendeeStatus";
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_NONE = 0;
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_ACCEPTED = 1;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_DECLINED = 2;
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_INVITED = 3;
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int ATTENDEE_STATUS_TENTATIVE = 4;
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
710c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
7113771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * Fields and helpers for interacting with Attendees. Each row of this table
7123771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * represents a single attendee or guest of an event. Calling
71358644028f909ecb429b26f909bedfb62a153d4e4RoboErik     * {@link #query(ContentResolver, long, String[])} will return a list of attendees for
7143771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * the event with the given eventId. Both apps and sync adapters may write
7153771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * to this table. There are six writable fields and all of them except
7163771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * {@link #ATTENDEE_NAME} must be included when inserting a new attendee.
7173771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * They are:
7183771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <ul>
7193771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #EVENT_ID}</li>
7203771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_NAME}</li>
7213771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_EMAIL}</li>
7223771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_RELATIONSHIP}</li>
7233771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_TYPE}</li>
7243771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #ATTENDEE_STATUS}</li>
7253771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * </ul>
726c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
7271dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio    public static final class Attendees implements BaseColumns, AttendeesColumns, EventsColumns {
728c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik
729c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
730c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for accessing Attendees data
731c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
732c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
7331dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/attendees");
734c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=?";
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
736c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
7373672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
7383672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
7393672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Attendees() {}
7403672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
7413672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
742c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Queries all attendees associated with the given event. This is a
743c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * blocking call and should not be done on the UI thread.
7443672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         *
745c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cr The content resolver to use for the query
746c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param eventId The id of the event to retrieve attendees for
74758644028f909ecb429b26f909bedfb62a153d4e4RoboErik         * @param projection the columns to return in the cursor
748c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return A Cursor containing all attendees for the event
749c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
75058644028f909ecb429b26f909bedfb62a153d4e4RoboErik        public static final Cursor query(ContentResolver cr, long eventId, String[] projection) {
751c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            String[] attArgs = {Long.toString(eventId)};
75258644028f909ecb429b26f909bedfb62a153d4e4RoboErik            return cr.query(CONTENT_URI, projection, ATTENDEES_WHERE, attArgs /* selection args */,
753c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                    null /* sort order */);
754c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        }
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Columns from the Events table that other tables join into themselves.
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
760b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface EventsColumns {
761df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden
762df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden        /**
763c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The {@link Calendars#_ID} of the calendar the event belongs to.
764c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Column name.
765c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER</P>
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CALENDAR_ID = "calendar_id";
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
770c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The title of the event. Column name.
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String TITLE = "title";
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
776c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The description of the event. Column name.
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DESCRIPTION = "description";
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
782c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Where the event takes place. Column name.
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_LOCATION = "eventLocation";
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
7889734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * A secondary color for the individual event. Column name.
7899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: INTEGER</P>
7909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
7919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String EVENT_COLOR = "eventColor";
7929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
7939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
794c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The event status. Column name.
795c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (one of {@link #STATUS_TENTATIVE}...)</P>
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String STATUS = "eventStatus";
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int STATUS_TENTATIVE = 0;
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int STATUS_CONFIRMED = 1;
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int STATUS_CANCELED = 2;
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This is a copy of the attendee status for the owner of this event.
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This field is copied here so that we can efficiently filter out
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * events that are declined without having to look in the Attendees
807c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * table. Column name.
8085b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff         *
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String SELF_ATTENDEE_STATUS = "selfAttendeeStatus";
8125b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
814c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * This column is available for use by sync adapters. Column name.
81564a556d755d27b1182897e9243cf4f3016e76a88Marc Blank         * <P>Type: TEXT</P>
81664a556d755d27b1182897e9243cf4f3016e76a88Marc Blank         */
817651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String SYNC_DATA1 = "sync_data1";
81864a556d755d27b1182897e9243cf4f3016e76a88Marc Blank
81964a556d755d27b1182897e9243cf4f3016e76a88Marc Blank        /**
8209734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8219734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8229734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8239734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA2 = "sync_data2";
8249734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8259734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
8269734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8279734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8289734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8299734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA3 = "sync_data3";
8309734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8319734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
8329734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8339734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8349734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8359734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA4 = "sync_data4";
8369734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8379734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
8389734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8399734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8409734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8419734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA5 = "sync_data5";
8429734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8439734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
8449734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8459734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8469734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8479734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA6 = "sync_data6";
8489734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8499734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
8509734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
851866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * <P>Type: TEXT</P>
852866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         */
853866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        public static final String SYNC_DATA7 = "sync_data7";
854866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert
855866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        /**
8569734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8579734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8589734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8599734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA8 = "sync_data8";
8609734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8619734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
8629734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8639734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8649734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8659734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA9 = "sync_data9";
8669734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8679734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
8689734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * This column is available for use by sync adapters. Column name.
8699734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         * <P>Type: TEXT</P>
8709734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik         */
8719734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        public static final String SYNC_DATA10 = "sync_data10";
8729734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik
8739734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik        /**
874866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * Used to indicate that a row is not a real event but an original copy of a locally
875866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * modified event. A copy is made when an event changes from non-dirty to dirty and the
876866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * event is on a calendar with {@link Calendars#CAN_PARTIALLY_UPDATE} set to 1. This copy
877866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * does not get expanded in the instances table and is only visible in queries made by a
878866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * sync adapter. The copy gets removed when the event is changed back to non-dirty by a
879866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * sync adapter.
880866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         * <P>Type: INTEGER (boolean)</P>
881866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert         */
882866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        public static final String LAST_SYNCED = "lastSynced";
883866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert
884866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert        /**
885c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The time the event starts in UTC millis since epoch. Column name.
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DTSTART = "dtstart";
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
891c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The time the event ends in UTC millis since epoch. Column name.
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DTEND = "dtend";
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
897c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The duration of the event in RFC2445 format. Column name.
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT (duration in RFC2445 format)</P>
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DURATION = "duration";
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
903c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The timezone for the event. Column name.
904c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: TEXT</P>
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_TIMEZONE = "eventTimezone";
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
909c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The timezone for the end time of the event. Column name.
910c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: TEXT</P>
911c07b06f12ac1f93b35f3e120a5e7d6aa5f934c6fErik         */
912651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String EVENT_END_TIMEZONE = "eventEndTimezone";
913c07b06f12ac1f93b35f3e120a5e7d6aa5f934c6fErik
914c07b06f12ac1f93b35f3e120a5e7d6aa5f934c6fErik        /**
915c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Is the event all day (time zone independent). Column name.
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ALL_DAY = "allDay";
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
921651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Defines how the event shows up for others when the calendar is
922c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * shared. Column name.
923c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (One of {@link #ACCESS_DEFAULT}, ...)</P>
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
925651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String ACCESS_LEVEL = "accessLevel";
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
927651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
928651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Default access is controlled by the server and will be treated as
929651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * public on the device.
930651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
931651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int ACCESS_DEFAULT = 0;
932651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
933651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Confidential is not used by the app.
934651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
935651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int ACCESS_CONFIDENTIAL = 1;
936651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
937c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Private shares the event as a free/busy slot with no details.
938651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
939651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int ACCESS_PRIVATE = 2;
940651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
941c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Public makes the contents visible to anyone with access to the
942651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * calendar.
943651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
944651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int ACCESS_PUBLIC = 3;
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
947651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * If this event counts as busy time or is still free time that can be
948c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * scheduled over. Column name.
949c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (One of {@link #AVAILABILITY_BUSY},
950c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * {@link #AVAILABILITY_FREE})</P>
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
952651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String AVAILABILITY = "availability";
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
954651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
955651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Indicates that this event takes up time and will conflict with other
956651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * events.
957651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
958651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int AVAILABILITY_BUSY = 0;
959651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
960651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * Indicates that this event is free time and will not conflict with
961651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * other events.
962651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
963651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final int AVAILABILITY_FREE = 1;
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
966c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether the event has an alarm or not. Column name.
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String HAS_ALARM = "hasAlarm";
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
972c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether the event has extended properties or not. Column name.
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String HAS_EXTENDED_PROPERTIES = "hasExtendedProperties";
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
978c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The recurrence rule for the event. Column name.
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String RRULE = "rrule";
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
984c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The recurrence dates for the event. Column name.
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String RDATE = "rdate";
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
990c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The recurrence exception rule for the event. Column name.
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EXRULE = "exrule";
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
996c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The recurrence exception dates for the event. Column name.
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EXDATE = "exdate";
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1002c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The {@link Events#_ID} of the original recurring event for which this
1003c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * event is an exception. Column name.
1004c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik         * <P>Type: TEXT</P>
1005c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik         */
1006c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik        public static final String ORIGINAL_ID = "original_id";
1007c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik
1008c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik        /**
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The _sync_id of the original recurring event for which this event is
1010c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik         * an exception. The provider should keep the original_id in sync when
1011c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * this is updated. Column name.
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1014651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String ORIGINAL_SYNC_ID = "original_sync_id";
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The original instance time of the recurring event for which this
1018c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * event is an exception. Column name.
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ORIGINAL_INSTANCE_TIME = "originalInstanceTime";
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The allDay status (true or false) of the original recurring event
1025c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * for which this event is an exception. Column name.
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ORIGINAL_ALL_DAY = "originalAllDay";
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1031c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The last date this event repeats on, or NULL if it never ends. Column
1032c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * name.
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String LAST_DATE = "lastDate";
103679f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff
103779f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff        /**
103879f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff         * Whether the event has attendee information.  True if the event
103979f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff         * has full attendee data, false if the event has information about
1040c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * self only. Column name.
104179f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff         * <P>Type: INTEGER (boolean)</P>
104279f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff         */
104379f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff        public static final String HAS_ATTENDEE_DATA = "hasAttendeeData";
10443d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
10453d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1046c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether guests can modify the event. Column name.
10473d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: INTEGER (boolean)</P>
10483d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
10493d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String GUESTS_CAN_MODIFY = "guestsCanModify";
10503d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
10513d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1052c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether guests can invite other guests. Column name.
10533d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: INTEGER (boolean)</P>
10543d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
10553d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String GUESTS_CAN_INVITE_OTHERS = "guestsCanInviteOthers";
10563d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
10573d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1058c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether guests can see the list of attendees. Column name.
10593d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: INTEGER (boolean)</P>
10603d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
10613d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String GUESTS_CAN_SEE_GUESTS = "guestsCanSeeGuests";
10623d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
10633d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1064c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Email of the organizer (owner) of the event. Column name.
10653d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: STRING</P>
10663d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
10673d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String ORGANIZER = "organizer";
10683d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff
10693d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        /**
1070c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Whether the user can invite others to the event. The
1071c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * GUESTS_CAN_INVITE_OTHERS is a setting that applies to an arbitrary
1072c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * guest, while CAN_INVITE_OTHERS indicates if the user can invite
1073c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * others (either through GUESTS_CAN_INVITE_OTHERS or because the user
1074c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * has modify access to the event). Column name.
10753d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         * <P>Type: INTEGER (boolean, readonly)</P>
10763d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff         */
10773d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff        public static final String CAN_INVITE_OTHERS = "canInviteOthers";
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1081c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Class that represents an Event Entity. There is one entry per event.
1082c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Recurring events show up as a single entry. This is a helper class to
1083c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * make batch operations easier. A {@link ContentResolver} or
1084c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * {@link ContentProviderClient} is required as the helper does additional
1085c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * queries to add reminders and attendees to each entry.
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1087651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik    public static final class EventsEntity implements BaseColumns, SyncColumns, EventsColumns {
1088328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        /**
1089328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         * The content:// style URL for this table
1090328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana         */
1091a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
1092a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                "/event_entities");
1093328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1094c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
10953672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
10963672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
10973672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private EventsEntity() {}
10983672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
10993672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
1100c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Creates a new iterator for events
1101c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
1102c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cursor An event query
1103c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param resolver For performing additional queries
1104c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return an EntityIterator containing one entity per event in the
1105c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         cursor
1106c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
1107328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        public static EntityIterator newEntityIterator(Cursor cursor, ContentResolver resolver) {
1108328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            return new EntityIteratorImpl(cursor, resolver);
1109328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        }
1110328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1111c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1112c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Creates a new iterator for events
1113c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
1114c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cursor An event query
1115c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param provider For performing additional queries
1116c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return an EntityIterator containing one entity per event in the
1117c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         cursor
1118c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
1119328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        public static EntityIterator newEntityIterator(Cursor cursor,
1120328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                ContentProviderClient provider) {
1121328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            return new EntityIteratorImpl(cursor, provider);
1122328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        }
1123328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1124328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        private static class EntityIteratorImpl extends CursorEntityIterator {
1125328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private final ContentResolver mResolver;
1126328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private final ContentProviderClient mProvider;
1127328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1128328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final String[] REMINDERS_PROJECTION = new String[] {
1129328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Reminders.MINUTES,
1130328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Reminders.METHOD,
1131328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            };
1132328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_MINUTES = 0;
1133328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_METHOD = 1;
1134328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1135328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final String[] ATTENDEES_PROJECTION = new String[] {
1136328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_NAME,
1137328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_EMAIL,
1138328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_RELATIONSHIP,
1139328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_TYPE,
1140328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    Attendees.ATTENDEE_STATUS,
1141328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            };
1142328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_NAME = 0;
1143328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_EMAIL = 1;
1144328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_RELATIONSHIP = 2;
1145328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_TYPE = 3;
1146328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final int COLUMN_ATTENDEE_STATUS = 4;
1147328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            private static final String[] EXTENDED_PROJECTION = new String[] {
11488f643c1040d45f03584b0382c7c5d933388b9103Marc Blank                    ExtendedProperties._ID,
1149328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    ExtendedProperties.NAME,
11508f643c1040d45f03584b0382c7c5d933388b9103Marc Blank                    ExtendedProperties.VALUE
1151328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            };
11528f643c1040d45f03584b0382c7c5d933388b9103Marc Blank            private static final int COLUMN_ID = 0;
11538f643c1040d45f03584b0382c7c5d933388b9103Marc Blank            private static final int COLUMN_NAME = 1;
11548f643c1040d45f03584b0382c7c5d933388b9103Marc Blank            private static final int COLUMN_VALUE = 2;
1155328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
11561dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio            private static final String WHERE_EVENT_ID = "event_id=?";
11571dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
1158328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            public EntityIteratorImpl(Cursor cursor, ContentResolver resolver) {
1159328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                super(cursor);
1160328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                mResolver = resolver;
1161328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                mProvider = null;
1162328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            }
1163328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1164328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            public EntityIteratorImpl(Cursor cursor, ContentProviderClient provider) {
1165328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                super(cursor);
1166328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                mResolver = null;
1167328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                mProvider = provider;
1168328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            }
1169328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
117064a556d755d27b1182897e9243cf4f3016e76a88Marc Blank            @Override
1171328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            public Entity getEntityAndIncrementCursor(Cursor cursor) throws RemoteException {
1172328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                // we expect the cursor is already at the row we need to read from
1173328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                final long eventId = cursor.getLong(cursor.getColumnIndexOrThrow(Events._ID));
1174328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                ContentValues cv = new ContentValues();
1175328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                cv.put(Events._ID, eventId);
1176328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, CALENDAR_ID);
1177328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, TITLE);
1178328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, DESCRIPTION);
1179328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_LOCATION);
1180328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, STATUS);
1181328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, SELF_ATTENDEE_STATUS);
1182328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DTSTART);
1183328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DTEND);
1184328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, DURATION);
1185328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_TIMEZONE);
1186c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_END_TIMEZONE);
1187328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ALL_DAY);
1188651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, ACCESS_LEVEL);
1189651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, AVAILABILITY);
1190328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, HAS_ALARM);
1191328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv,
1192328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        HAS_EXTENDED_PROPERTIES);
1193328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, RRULE);
1194328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, RDATE);
1195328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EXRULE);
1196328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EXDATE);
1197651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORIGINAL_SYNC_ID);
1198c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORIGINAL_ID);
1199328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv,
1200328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        ORIGINAL_INSTANCE_TIME);
1201328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, ORIGINAL_ALL_DAY);
1202328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, LAST_DATE);
1203328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, HAS_ATTENDEE_DATA);
1204328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv,
1205328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        GUESTS_CAN_INVITE_OTHERS);
1206328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, GUESTS_CAN_MODIFY);
1207328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, GUESTS_CAN_SEE_GUESTS);
1208328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORGANIZER);
1209328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_ID);
1210651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DIRTY);
1211866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, LAST_SYNCED);
1212c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, DELETED);
12139734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA1);
12149734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA2);
12159734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA3);
12169734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA4);
12179734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA5);
12189734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA6);
12199734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA7);
12209734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA8);
12219734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA9);
12229734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA10);
1223be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC1);
1224be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC2);
1225be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC3);
1226be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC4);
1227be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC5);
1228be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC6);
12299734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC7);
12309734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC8);
12319734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC9);
12329734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC10);
1233328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1234328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                Entity entity = new Entity(cv);
1235328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                Cursor subCursor;
1236328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                if (mResolver != null) {
1237328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mResolver.query(Reminders.CONTENT_URI, REMINDERS_PROJECTION,
12381dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
12391dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) }  /* selectionArgs */,
12401dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1241328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } else {
1242328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mProvider.query(Reminders.CONTENT_URI, REMINDERS_PROJECTION,
12431dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
12441dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) }  /* selectionArgs */,
12451dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1246328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1247328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                try {
1248328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    while (subCursor.moveToNext()) {
1249328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        ContentValues reminderValues = new ContentValues();
1250328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        reminderValues.put(Reminders.MINUTES, subCursor.getInt(COLUMN_MINUTES));
1251328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        reminderValues.put(Reminders.METHOD, subCursor.getInt(COLUMN_METHOD));
1252328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        entity.addSubValue(Reminders.CONTENT_URI, reminderValues);
1253328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    }
1254328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } finally {
1255328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor.close();
1256328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1257328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1258328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                if (mResolver != null) {
1259328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mResolver.query(Attendees.CONTENT_URI, ATTENDEES_PROJECTION,
12601dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
12611dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) } /* selectionArgs */,
12621dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1263328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } else {
1264328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mProvider.query(Attendees.CONTENT_URI, ATTENDEES_PROJECTION,
12651dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
12661dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) } /* selectionArgs */,
12671dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1268328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1269328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                try {
1270328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    while (subCursor.moveToNext()) {
1271328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        ContentValues attendeeValues = new ContentValues();
1272328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_NAME,
1273328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getString(COLUMN_ATTENDEE_NAME));
1274328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_EMAIL,
1275328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getString(COLUMN_ATTENDEE_EMAIL));
1276328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_RELATIONSHIP,
1277328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getInt(COLUMN_ATTENDEE_RELATIONSHIP));
1278328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_TYPE,
1279328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getInt(COLUMN_ATTENDEE_TYPE));
1280328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        attendeeValues.put(Attendees.ATTENDEE_STATUS,
1281328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                                subCursor.getInt(COLUMN_ATTENDEE_STATUS));
1282328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        entity.addSubValue(Attendees.CONTENT_URI, attendeeValues);
1283328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    }
1284328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } finally {
1285328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor.close();
1286328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1287328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1288328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                if (mResolver != null) {
1289328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mResolver.query(ExtendedProperties.CONTENT_URI, EXTENDED_PROJECTION,
12901dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
12911dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) } /* selectionArgs */,
12921dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1293328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } else {
1294328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor = mProvider.query(ExtendedProperties.CONTENT_URI, EXTENDED_PROJECTION,
12951dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            WHERE_EVENT_ID,
12961dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            new String[] { Long.toString(eventId) } /* selectionArgs */,
12971dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                            null /* sortOrder */);
1298328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1299328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                try {
1300328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    while (subCursor.moveToNext()) {
1301328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        ContentValues extendedValues = new ContentValues();
13028f643c1040d45f03584b0382c7c5d933388b9103Marc Blank                        extendedValues.put(ExtendedProperties._ID,
13038f643c1040d45f03584b0382c7c5d933388b9103Marc Blank                                subCursor.getString(COLUMN_ID));
13043b16892c6bc6b804133163db24ffc5ff54b9a8fbKen Shirriff                        extendedValues.put(ExtendedProperties.NAME,
13053b16892c6bc6b804133163db24ffc5ff54b9a8fbKen Shirriff                                subCursor.getString(COLUMN_NAME));
1306328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        extendedValues.put(ExtendedProperties.VALUE,
13073b16892c6bc6b804133163db24ffc5ff54b9a8fbKen Shirriff                                subCursor.getString(COLUMN_VALUE));
1308328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                        entity.addSubValue(ExtendedProperties.CONTENT_URI, extendedValues);
1309328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    }
1310328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                } finally {
1311328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                    subCursor.close();
1312328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                }
1313328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1314328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                cursor.moveToNext();
1315328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana                return entity;
1316328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana            }
1317328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana        }
1318328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana    }
1319328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana
1320328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana    /**
1321f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * Constants and helpers for the Events table, which contains details for
1322f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * individual events. <h3>Operations</h3> All operations can be done either
1323f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * as an app or as a sync adapter. To perform an operation as a sync adapter
1324f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #CALLER_IS_SYNCADAPTER} should be set to true and
1325f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link #ACCOUNT_NAME} and {@link #ACCOUNT_TYPE} must be set in the Uri
1326f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * parameters. See
1327f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * {@link Uri.Builder#appendQueryParameter(java.lang.String, java.lang.String)}
1328f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * for details on adding parameters. Sync adapters have write access to more
1329f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * columns but are restricted to a single account at a time.
1330fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dl>
1331fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dt><b>Insert</b></dt>
1332fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dd>When inserting a new event the following fields must be included:
1333fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <ul>
1334fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>dtstart</li>
1335fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>dtend -or- a (rrule or rdate) and a duration</li>
1336fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>a calendar_id</li>
1337fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </ul>
1338fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * There are also further requirements when inserting or updating an event.
1339fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * See the section on Writing to Events.</dd>
1340fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dt><b>Update</b></dt>
1341f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * <dd>To perform an update of an Event the {@link Events#_ID} of the event
1342f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * should be provided either as an appended id to the Uri (
1343fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * {@link ContentUris#withAppendedId}) or as the first selection item--the
1344fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * selection should start with "_id=?" and the first selectionArg should be
1345f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * the _id of the event. Updates may also be done using a selection and no
1346f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * id. Updating an event must respect the same rules as inserting and is
1347f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * further restricted in the fields that can be written. See the section on
1348f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik     * Writing to Events.</dd>
1349fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dt><b>Delete</b></dt>
1350fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dd>Events can be deleted either by the {@link Events#_ID} as an appended
1351fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * id on the Uri or using any standard selection. If an appended id is used
1352fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * a selection is not allowed. There are two versions of delete: as an app
1353fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * and as a sync adapter. An app delete will set the deleted column on an
1354fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * event and remove all instances of that event. A sync adapter delete will
1355fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * remove the event from the database and all associated data.</dd>
1356fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dt><b>Query</b></dt>
1357fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <dd>Querying the Events table will get you all information about a set of
1358fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * events except their reminders, attendees, and extended properties. There
1359fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * will be one row returned for each event that matches the query selection,
1360fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * or at most a single row if the {@link Events#_ID} is appended to the Uri.
1361fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * Recurring events will only return a single row regardless of the number
1362fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * of times that event repeats.</dd>
1363fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </dl>
1364fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <h3>Writing to Events</h3> There are further restrictions on all Updates
1365fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * and Inserts in the Events table:
1366fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <ul>
1367fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>If allDay is set to 1 eventTimezone must be {@link Time#TIMEZONE_UTC}
1368fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * and the time must correspond to a midnight boundary.</li>
1369fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>Exceptions are not allowed to recur. If rrule or rdate is not empty,
1370fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * original_id and original_sync_id must be empty.</li>
1371fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>In general a calendar_id should not be modified after insertion. This
1372fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * is not explicitly forbidden but many sync adapters will not behave in an
1373fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * expected way if the calendar_id is modified.</li>
1374fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </ul>
1375fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * The following Events columns are writable by both an app and a sync
1376fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * adapter.
1377fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <ul>
1378fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #CALENDAR_ID}</li>
1379fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORGANIZER}</li>
1380fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #TITLE}</li>
1381fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EVENT_LOCATION}</li>
1382fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DESCRIPTION}</li>
1383fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EVENT_COLOR}</li>
1384fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DTSTART}</li>
1385fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DTEND}</li>
1386fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EVENT_TIMEZONE}</li>
1387fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EVENT_END_TIMEZONE}</li>
1388fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DURATION}</li>
1389fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ALL_DAY}</li>
1390fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #RRULE}</li>
1391fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #RDATE}</li>
1392fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EXRULE}</li>
1393fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #EXDATE}</li>
1394fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORIGINAL_ID}</li>
1395fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORIGINAL_SYNC_ID}</li>
1396fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORIGINAL_INSTANCE_TIME}</li>
1397fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ORIGINAL_ALL_DAY}</li>
1398fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #ACCESS_LEVEL}</li>
1399fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #AVAILABILITY}</li>
1400fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #GUESTS_CAN_MODIFY}</li>
1401fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #GUESTS_CAN_INVITE_OTHERS}</li>
1402fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #GUESTS_CAN_SEE_GUESTS}</li>
1403fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </ul>
1404fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * The following Events columns are writable only by a sync adapter
1405fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <ul>
1406fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #DIRTY}</li>
1407fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #_SYNC_ID}</li>
1408fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA1}</li>
1409fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA2}</li>
1410fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA3}</li>
1411fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA4}</li>
1412fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA5}</li>
1413fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA6}</li>
1414fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA7}</li>
1415fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA8}</li>
1416fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA9}</li>
1417fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * <li>{@link #SYNC_DATA10}</li>
1418fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * </ul>
1419fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * The remaining columns are either updated by the provider only or are
1420fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik     * views into other tables and cannot be changed through the Events table.
1421328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana     */
14229734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik    public static final class Events implements BaseColumns, SyncColumns, EventsColumns,
1423e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            CalendarColumns {
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1425c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1426c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for interacting with events. Appending an
1427c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * event id using {@link ContentUris#withAppendedId(Uri, long)} will
1428c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * specify a single event.
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1430c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri CONTENT_URI =
1432a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                Uri.parse("content://" + AUTHORITY + "/events");
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14354a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden         * The content:// style URI for recurring event exceptions.  Insertions require an
14364a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden         * appended event ID.  Deletion of exceptions requires both the original event ID and
14374a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden         * the exception event ID (see {@link Uri.Builder#appendPath}).
14384a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden         */
1439083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final Uri CONTENT_EXCEPTION_URI =
14404a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden                Uri.parse("content://" + AUTHORITY + "/exception");
14414a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden
14424a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden        /**
14433672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
14443672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
14453672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Events() {}
14463672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
14473672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1450c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String DEFAULT_SORT_ORDER = "";
1451651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik
1452651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1453651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * These are columns that should only ever be updated by the provider,
1454651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * either because they are views mapped to another table or because they
1455083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * are used for provider only functionality. TODO move to provider
1456083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         *
1457083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
1458651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1459651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static String[] PROVIDER_WRITABLE_COLUMNS = new String[] {
1460651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik                ACCOUNT_NAME,
1461c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                ACCOUNT_TYPE,
1462c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC1,
1463c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC2,
1464c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC3,
1465c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC4,
1466c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                CAL_SYNC5,
1467866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                CAL_SYNC6,
14689734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAL_SYNC7,
14699734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAL_SYNC8,
14709734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAL_SYNC9,
14719734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAL_SYNC10,
14729734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                ALLOWED_REMINDERS,
14739734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CALENDAR_ACCESS_LEVEL,
14749734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CALENDAR_COLOR,
14759734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CALENDAR_TIME_ZONE,
14769734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAN_MODIFY_TIME_ZONE,
14779734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CAN_ORGANIZER_RESPOND,
14789734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                CALENDAR_DISPLAY_NAME,
1479866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert                CAN_PARTIALLY_UPDATE,
14809734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                SYNC_EVENTS,
14819734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik                VISIBLE,
1482651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        };
1483651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik
1484651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        /**
1485651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * These fields are only writable by a sync adapter. To modify them the
1486651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         * caller must include CALLER_IS_SYNCADAPTER, _SYNC_ACCOUNT, and
1487083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * _SYNC_ACCOUNT_TYPE in the query parameters. TODO move to provider.
1488083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         *
1489083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
1490651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik         */
1491651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        public static final String[] SYNC_WRITABLE_COLUMNS = new String[] {
1492651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            _SYNC_ID,
1493651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik            DIRTY,
14949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA1,
14959734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA2,
14969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA3,
14979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA4,
14989734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA5,
14999734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA6,
15009734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA7,
15019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA8,
15029734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA9,
15039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik            SYNC_DATA10,
1504651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik        };
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1508c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Fields and helpers for interacting with Instances. An instance is a
1509c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * single occurrence of an event including time zone specific start and end
15103771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * days and minutes. The instances table is not writable and only provides a
15113771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * way to query event occurrences.
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1513e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik    public static final class Instances implements BaseColumns, EventsColumns, CalendarColumns {
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1515e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik        private static final String WHERE_CALENDARS_SELECTED = Calendars.VISIBLE + "=?";
1516e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik        private static final String[] WHERE_CALENDARS_ARGS = {
1517e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            "1"
1518e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik        };
15191dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
1520c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
15213672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
15223672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
15233672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Instances() {}
15243672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
15253672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
1526c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Performs a query to return all visible instances in the given range.
1527c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * This is a blocking function and should not be done on the UI thread.
1528c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * This will cause an expansion of recurring events to fill this time
1529c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * range if they are not already expanded and will slow down for larger
1530c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * time ranges with many recurring events.
1531c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
1532c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cr The ContentResolver to use for the query
1533c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param projection The columns to return
1534c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param begin The start of the time range to query in UTC millis since
1535c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
1536c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param end The end of the time range to query in UTC millis since
1537c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
1538c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return A Cursor containing all instances in the given range
1539c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Cursor query(ContentResolver cr, String[] projection,
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                         long begin, long end) {
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri.Builder builder = CONTENT_URI.buildUpon();
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentUris.appendId(builder, begin);
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentUris.appendId(builder, end);
15451dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio            return cr.query(builder.build(), projection, WHERE_CALENDARS_SELECTED,
1546e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik                    WHERE_CALENDARS_ARGS, DEFAULT_SORT_ORDER);
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1550c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Performs a query to return all visible instances in the given range
1551c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * that match the given query. This is a blocking function and should
1552c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * not be done on the UI thread. This will cause an expansion of
1553c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * recurring events to fill this time range if they are not already
1554c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * expanded and will slow down for larger time ranges with many
1555c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * recurring events.
1556c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
1557c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cr The ContentResolver to use for the query
1558c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param projection The columns to return
1559c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param begin The start of the time range to query in UTC millis since
1560c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
1561c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param end The end of the time range to query in UTC millis since
1562c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
1563c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param searchQuery A string of space separated search terms. Segments
1564c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            enclosed by double quotes will be treated as a single
1565c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            term.
1566c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return A Cursor of instances matching the search terms in the given
1567c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         time range
1568c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Cursor query(ContentResolver cr, String[] projection,
157019f845804c4b8f295669bbe7338d91d42451a0fdMason Tang                                         long begin, long end, String searchQuery) {
157119f845804c4b8f295669bbe7338d91d42451a0fdMason Tang            Uri.Builder builder = CONTENT_SEARCH_URI.buildUpon();
157219f845804c4b8f295669bbe7338d91d42451a0fdMason Tang            ContentUris.appendId(builder, begin);
157319f845804c4b8f295669bbe7338d91d42451a0fdMason Tang            ContentUris.appendId(builder, end);
1574c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            builder = builder.appendPath(searchQuery);
1575e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            return cr.query(builder.build(), projection, WHERE_CALENDARS_SELECTED,
1576e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik                    WHERE_CALENDARS_ARGS, DEFAULT_SORT_ORDER);
157719f845804c4b8f295669bbe7338d91d42451a0fdMason Tang        }
157819f845804c4b8f295669bbe7338d91d42451a0fdMason Tang
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1580c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for querying an instance range. The begin
1581c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * and end of the range to query should be added as path segments if
1582c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * this is used directly.
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1584c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
1585a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
1586a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                "/instances/when");
1587c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1588c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for querying an instance range by Julian
1589c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Day. The start and end day should be added as path segments if this
1590c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * is used directly.
1591c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
15922cfb0d166b5e8a0e89b2b3d19abe4f76ff38cfabMichael Chan        public static final Uri CONTENT_BY_DAY_URI =
1593a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff            Uri.parse("content://" + AUTHORITY + "/instances/whenbyday");
1594c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1595c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for querying an instance range with a search
1596c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * term. The begin, end, and search string should be appended as path
1597c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * segments if this is used directly.
1598c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
159919f845804c4b8f295669bbe7338d91d42451a0fdMason Tang        public static final Uri CONTENT_SEARCH_URI = Uri.parse("content://" + AUTHORITY +
160019f845804c4b8f295669bbe7338d91d42451a0fdMason Tang                "/instances/search");
1601c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1602c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The content:// style URL for querying an instance range with a search
1603c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * term. The start day, end day, and search string should be appended as
1604c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * path segments if this is used directly.
1605c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
160619f845804c4b8f295669bbe7338d91d42451a0fdMason Tang        public static final Uri CONTENT_SEARCH_BY_DAY_URI =
160719f845804c4b8f295669bbe7338d91d42451a0fdMason Tang            Uri.parse("content://" + AUTHORITY + "/instances/searchbyday");
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table.
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1612c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String DEFAULT_SORT_ORDER = "begin ASC";
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1615c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The beginning time of the instance, in UTC milliseconds. Column name.
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String BEGIN = "begin";
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1621c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The ending time of the instance, in UTC milliseconds. Column name.
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String END = "end";
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1627c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The _id of the event for this instance. Column name.
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long, foreign key to the Events table)</P>
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1633c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Julian start day of the instance, relative to the local time
1634c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * zone. Column name.
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String START_DAY = "startDay";
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1640c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Julian end day of the instance, relative to the local time
1641c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * zone. Column name.
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String END_DAY = "endDay";
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The start minute of the instance measured from midnight in the
1648c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * local time zone. Column name.
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String START_MINUTE = "startMinute";
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The end minute of the instance measured from midnight in the
1655c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * local time zone. Column name.
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String END_MINUTE = "endMinute";
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1661b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface CalendarCacheColumns {
166271ad58c751eb12a500916556c41e704a93895801Erik        /**
1663c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The key for the setting. Keys are defined in {@link CalendarCache}.
166471ad58c751eb12a500916556c41e704a93895801Erik         */
166571ad58c751eb12a500916556c41e704a93895801Erik        public static final String KEY = "key";
166671ad58c751eb12a500916556c41e704a93895801Erik
166771ad58c751eb12a500916556c41e704a93895801Erik        /**
166871ad58c751eb12a500916556c41e704a93895801Erik         * The value of the given setting.
166971ad58c751eb12a500916556c41e704a93895801Erik         */
167071ad58c751eb12a500916556c41e704a93895801Erik        public static final String VALUE = "value";
167171ad58c751eb12a500916556c41e704a93895801Erik    }
167271ad58c751eb12a500916556c41e704a93895801Erik
1673083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik    /**
1674083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     * CalendarCache stores some settings for calendar including the current
1675083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     * time zone for the instances. These settings are stored using a key/value
1676083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     * scheme. A {@link #KEY} must be specified when updating these values.
1677083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik     */
16783672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik    public static final class CalendarCache implements CalendarCacheColumns {
167971ad58c751eb12a500916556c41e704a93895801Erik        /**
168071ad58c751eb12a500916556c41e704a93895801Erik         * The URI to use for retrieving the properties from the Calendar db.
168171ad58c751eb12a500916556c41e704a93895801Erik         */
168271ad58c751eb12a500916556c41e704a93895801Erik        public static final Uri URI =
168371ad58c751eb12a500916556c41e704a93895801Erik                Uri.parse("content://" + AUTHORITY + "/properties");
168471ad58c751eb12a500916556c41e704a93895801Erik
168571ad58c751eb12a500916556c41e704a93895801Erik        /**
16863672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
16873672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
16883672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private CalendarCache() {}
16893672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
16903672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
169171ad58c751eb12a500916556c41e704a93895801Erik         * They key for updating the use of auto/home time zones in Calendar.
169271ad58c751eb12a500916556c41e704a93895801Erik         * Valid values are {@link #TIMEZONE_TYPE_AUTO} or
169371ad58c751eb12a500916556c41e704a93895801Erik         * {@link #TIMEZONE_TYPE_HOME}.
169471ad58c751eb12a500916556c41e704a93895801Erik         */
1695083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final String KEY_TIMEZONE_TYPE = "timezoneType";
169671ad58c751eb12a500916556c41e704a93895801Erik
169771ad58c751eb12a500916556c41e704a93895801Erik        /**
169871ad58c751eb12a500916556c41e704a93895801Erik         * The key for updating the time zone used by the provider when it
169971ad58c751eb12a500916556c41e704a93895801Erik         * generates the instances table. This should only be written if the
170071ad58c751eb12a500916556c41e704a93895801Erik         * type is set to {@link #TIMEZONE_TYPE_HOME}. A valid time zone id
170171ad58c751eb12a500916556c41e704a93895801Erik         * should be written to this field.
170271ad58c751eb12a500916556c41e704a93895801Erik         */
1703083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final String KEY_TIMEZONE_INSTANCES = "timezoneInstances";
170471ad58c751eb12a500916556c41e704a93895801Erik
170571ad58c751eb12a500916556c41e704a93895801Erik        /**
170671ad58c751eb12a500916556c41e704a93895801Erik         * The key for reading the last time zone set by the user. This should
170771ad58c751eb12a500916556c41e704a93895801Erik         * only be read by apps and it will be automatically updated whenever
1708083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * {@link #KEY_TIMEZONE_INSTANCES} is updated with
170971ad58c751eb12a500916556c41e704a93895801Erik         * {@link #TIMEZONE_TYPE_HOME} set.
171071ad58c751eb12a500916556c41e704a93895801Erik         */
1711083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final String KEY_TIMEZONE_INSTANCES_PREVIOUS = "timezoneInstancesPrevious";
171271ad58c751eb12a500916556c41e704a93895801Erik
171371ad58c751eb12a500916556c41e704a93895801Erik        /**
1714083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * The value to write to {@link #KEY_TIMEZONE_TYPE} if the provider
171571ad58c751eb12a500916556c41e704a93895801Erik         * should stay in sync with the device's time zone.
171671ad58c751eb12a500916556c41e704a93895801Erik         */
171771ad58c751eb12a500916556c41e704a93895801Erik        public static final String TIMEZONE_TYPE_AUTO = "auto";
171871ad58c751eb12a500916556c41e704a93895801Erik
171971ad58c751eb12a500916556c41e704a93895801Erik        /**
1720083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * The value to write to {@link #KEY_TIMEZONE_TYPE} if the provider
172171ad58c751eb12a500916556c41e704a93895801Erik         * should use a fixed time zone set by the user.
172271ad58c751eb12a500916556c41e704a93895801Erik         */
172371ad58c751eb12a500916556c41e704a93895801Erik        public static final String TIMEZONE_TYPE_HOME = "home";
172471ad58c751eb12a500916556c41e704a93895801Erik    }
172571ad58c751eb12a500916556c41e704a93895801Erik
172671ad58c751eb12a500916556c41e704a93895801Erik    /**
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A few Calendar globals are needed in the CalendarProvider for expanding
172859dab49cb8350afd1baa77999ec2f91283d78536RoboErik     * the Instances table and these are all stored in the first (and only) row
172959dab49cb8350afd1baa77999ec2f91283d78536RoboErik     * of the CalendarMetaData table.
173059dab49cb8350afd1baa77999ec2f91283d78536RoboErik     *
173159dab49cb8350afd1baa77999ec2f91283d78536RoboErik     * @hide
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1733b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface CalendarMetaDataColumns {
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The local timezone that was used for precomputing the fields
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in the Instances table.
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String LOCAL_TIMEZONE = "localTimezone";
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The minimum time used in expanding the Instances table,
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in UTC milliseconds.
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MIN_INSTANCE = "minInstance";
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum time used in expanding the Instances table,
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in UTC milliseconds.
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MAX_INSTANCE = "maxInstance";
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
17553763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * The minimum Julian day in the EventDays table.
17563763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * <P>Type: INTEGER</P>
17573763464e8f0df4d387ff46803e5a9c76045c85e6Erik         */
17583763464e8f0df4d387ff46803e5a9c76045c85e6Erik        public static final String MIN_EVENTDAYS = "minEventDays";
17593763464e8f0df4d387ff46803e5a9c76045c85e6Erik
17603763464e8f0df4d387ff46803e5a9c76045c85e6Erik        /**
17613763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * The maximum Julian day in the EventDays table.
17623763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * <P>Type: INTEGER</P>
17633763464e8f0df4d387ff46803e5a9c76045c85e6Erik         */
17643763464e8f0df4d387ff46803e5a9c76045c85e6Erik        public static final String MAX_EVENTDAYS = "maxEventDays";
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17665b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
1767c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
1768c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * @hide
1769c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
1770505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    public static final class CalendarMetaData implements CalendarMetaDataColumns, BaseColumns {
17713672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
17723672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
17733672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
17743672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
17753672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private CalendarMetaData() {}
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17773763464e8f0df4d387ff46803e5a9c76045c85e6Erik
1778b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface EventDaysColumns {
17793763464e8f0df4d387ff46803e5a9c76045c85e6Erik        /**
1780c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Julian starting day number. Column name.
17813763464e8f0df4d387ff46803e5a9c76045c85e6Erik         * <P>Type: INTEGER (int)</P>
17823763464e8f0df4d387ff46803e5a9c76045c85e6Erik         */
17833763464e8f0df4d387ff46803e5a9c76045c85e6Erik        public static final String STARTDAY = "startDay";
1784c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1785c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Julian ending day number. Column name.
1786c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER (int)</P>
1787c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
1788bd8e2e20a9a1d98f1521ec1f98b6403e73b275d3Erik        public static final String ENDDAY = "endDay";
17893763464e8f0df4d387ff46803e5a9c76045c85e6Erik
17903763464e8f0df4d387ff46803e5a9c76045c85e6Erik    }
17913763464e8f0df4d387ff46803e5a9c76045c85e6Erik
1792c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
1793c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Fields and helpers for querying for a list of days that contain events.
1794c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
17953763464e8f0df4d387ff46803e5a9c76045c85e6Erik    public static final class EventDays implements EventDaysColumns {
1796b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
1797c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                + "/instances/groupbyday");
1798c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String SELECTION = "selected=1";
17993763464e8f0df4d387ff46803e5a9c76045c85e6Erik
18003763464e8f0df4d387ff46803e5a9c76045c85e6Erik        /**
18013672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
18023672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
18033672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private EventDays() {}
18043672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
18053672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
1806c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Retrieves the days with events for the Julian days starting at
1807c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * "startDay" for "numDays". It returns a cursor containing startday and
1808c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * endday representing the max range of days for all events beginning on
1809c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * each startday.This is a blocking function and should not be done on
1810c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * the UI thread.
18113672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         *
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cr the ContentResolver
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param startDay the first Julian day in the range
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param numDays the number of days to load (must be at least 1)
181558644028f909ecb429b26f909bedfb62a153d4e4RoboErik         * @param projection the columns to return in the cursor
1816c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return a database cursor containing a list of start and end days for
1817c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         events
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
181958644028f909ecb429b26f909bedfb62a153d4e4RoboErik        public static final Cursor query(ContentResolver cr, int startDay, int numDays,
182058644028f909ecb429b26f909bedfb62a153d4e4RoboErik                String[] projection) {
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (numDays < 1) {
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int endDay = startDay + numDays - 1;
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri.Builder builder = CONTENT_URI.buildUpon();
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentUris.appendId(builder, startDay);
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentUris.appendId(builder, endDay);
182858644028f909ecb429b26f909bedfb62a153d4e4RoboErik            return cr.query(builder.build(), projection, SELECTION,
18293763464e8f0df4d387ff46803e5a9c76045c85e6Erik                    null /* selection args */, STARTDAY);
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1833b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface RemindersColumns {
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1835c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The event the reminder belongs to. Column name.
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (foreign key to the Events table)</P>
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The minutes prior to the event that the alarm should ring.  -1
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * specifies that we should use the default value for the system.
1843c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Column name.
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MINUTES = "minutes";
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1848c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
1849c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Passing this as a minutes value will use the default reminder
1850c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * minutes.
1851c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int MINUTES_DEFAULT = -1;
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1855c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The alarm method, as set on the server. {@link #METHOD_DEFAULT},
1856c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * {@link #METHOD_ALERT}, {@link #METHOD_EMAIL}, and {@link #METHOD_SMS}
1857c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * are possible values; the device will only process
1858c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * {@link #METHOD_DEFAULT} and {@link #METHOD_ALERT} reminders (the
1859c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * other types are simply stored so we can send the same reminder info
1860c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * back to the server when we make changes).
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String METHOD = "method";
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int METHOD_DEFAULT = 0;
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int METHOD_ALERT = 1;
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int METHOD_EMAIL = 2;
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int METHOD_SMS = 3;
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1870c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
18713771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * Fields and helpers for accessing reminders for an event. Each row of this
18723771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * table represents a single reminder for an event. Calling
187358644028f909ecb429b26f909bedfb62a153d4e4RoboErik     * {@link #query(ContentResolver, long, String[])} will return a list of reminders for
18743771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * the event with the given eventId. Both apps and sync adapters may write
18753771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * to this table. There are three writable fields and all of them must be
18763771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * included when inserting a new reminder. They are:
18773771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <ul>
18783771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #EVENT_ID}</li>
18793771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #MINUTES}</li>
18803771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #METHOD}</li>
18813771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * </ul>
1882c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class Reminders implements BaseColumns, RemindersColumns, EventsColumns {
1884bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik        private static final String REMINDERS_WHERE = CalendarContract.Reminders.EVENT_ID + "=?";
1885c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
1886a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/reminders");
1887c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik
1888c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
18893672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
18903672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
18913672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private Reminders() {}
18923672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
18933672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
1894c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Queries all reminders associated with the given event. This is a
1895c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * blocking call and should not be done on the UI thread.
18963672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         *
1897c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param cr The content resolver to use for the query
1898c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param eventId The id of the event to retrieve reminders for
189958644028f909ecb429b26f909bedfb62a153d4e4RoboErik         * @param projection the columns to return in the cursor
1900c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @return A Cursor containing all reminders for the event
1901c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
190258644028f909ecb429b26f909bedfb62a153d4e4RoboErik        public static final Cursor query(ContentResolver cr, long eventId, String[] projection) {
1903c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik            String[] remArgs = {Long.toString(eventId)};
190458644028f909ecb429b26f909bedfb62a153d4e4RoboErik            return cr.query(CONTENT_URI, projection, REMINDERS_WHERE, remArgs /*selection args*/,
1905c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik                    null /* sort order */);
1906c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        }
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface CalendarAlertsColumns {
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1911c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The event that the alert belongs to. Column name.
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (foreign key to the Events table)</P>
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1917c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The start time of the event, in UTC. Column name.
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String BEGIN = "begin";
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1923c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The end time of the event, in UTC. Column name.
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String END = "end";
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1929c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The alarm time of the event, in UTC. Column name.
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String ALARM_TIME = "alarmTime";
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The creation time of this database entry, in UTC.
1936c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Useful for debugging missed reminders. Column name.
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CREATION_TIME = "creationTime";
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The time that the alarm broadcast was received by the Calendar app,
1943c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * in UTC. Useful for debugging missed reminders. Column name.
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String RECEIVED_TIME = "receivedTime";
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The time that the notification was created by the Calendar app,
1950c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * in UTC. Useful for debugging missed reminders. Column name.
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long; millis since epoch)</P>
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NOTIFY_TIME = "notifyTime";
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1956083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * The state of this alert. It starts out as {@link #STATE_SCHEDULED}, then
1957083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * when the alarm goes off, it changes to {@link #STATE_FIRED}, and then when
1958083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * the user dismisses the alarm it changes to {@link #STATE_DISMISSED}. Column
1959c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * name.
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER</P>
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String STATE = "state";
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1964083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        /**
1965083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * An alert begins in this state when it is first created.
1966083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         */
1967083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final int STATE_SCHEDULED = 0;
1968083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        /**
1969083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * After a notification for an alert has been created it should be
1970083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * updated to fired.
1971083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         */
1972083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final int STATE_FIRED = 1;
1973083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        /**
1974083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * Once the user has dismissed the notification the alert's state should
1975083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * be set to dismissed so it is not fired again.
1976083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         */
1977083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        public static final int STATE_DISMISSED = 2;
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1980c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The number of minutes that this alarm precedes the start time. Column
1981c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * name.
1982c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * <P>Type: INTEGER</P>
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MINUTES = "minutes";
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1987c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The default sort order for this alerts queries
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1989cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan        public static final String DEFAULT_SORT_ORDER = "begin ASC,title ASC";
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1992c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
1993c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Fields and helpers for accessing calendar alerts information. These
19943771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * fields are for tracking which alerts have been fired. Scheduled alarms
1995e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik     * will generate an intent using {@link #ACTION_EVENT_REMINDER}. Apps that
19963771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * receive this action may update the {@link #STATE} for the reminder when
19973771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * they have finished handling it. Apps that have their notifications
19983771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * disabled should not modify the table to ensure that they do not conflict
19993771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * with another app that is generating a notification. In general, apps
20003771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * should not need to write to this table directly except to update the
20013771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * state of a reminder.
2002c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class CalendarAlerts implements BaseColumns,
2004e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            CalendarAlertsColumns, EventsColumns, CalendarColumns {
20051dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
2006c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
2007c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @hide
2008c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String TABLE_NAME = "CalendarAlerts";
2010c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
2011c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The Uri for querying calendar alert information
2012c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
2013c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        @SuppressWarnings("hiding")
2014a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
2015a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                "/calendar_alerts");
20165b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
20173672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
20183672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
20193672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
20203672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private CalendarAlerts() {}
20213672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
20221dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        private static final String WHERE_ALARM_EXISTS = EVENT_ID + "=?"
20231dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + BEGIN + "=?"
20241dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + ALARM_TIME + "=?";
20251dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
20261dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        private static final String WHERE_FINDNEXTALARMTIME = ALARM_TIME + ">=?";
20271dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio        private static final String SORT_ORDER_ALARMTIME_ASC = ALARM_TIME + " ASC";
20281dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
2029083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        private static final String WHERE_RESCHEDULE_MISSED_ALARMS = STATE + "=" + STATE_SCHEDULED
20301dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + ALARM_TIME + "<?"
20311dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + ALARM_TIME + ">?"
20321dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                + " AND " + END + ">=?";
20331dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This URI is for grouping the query results by event_id and begin
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * time.  This will return one result per instance of an event.  So
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * events with multiple alarms will appear just once, but multiple
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * instances of a repeating event will show up multiple times.
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20405b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff        public static final Uri CONTENT_URI_BY_INSTANCE =
2041a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff            Uri.parse("content://" + AUTHORITY + "/calendar_alerts/by_instance");
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2043083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik        private static final boolean DEBUG = false;
2044cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2045c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
2046083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * Helper for inserting an alarm time associated with an event TODO move
2047083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * to Provider
2048c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
2049c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @hide
2050c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri insert(ContentResolver cr, long eventId,
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long begin, long end, long alarmTime, int minutes) {
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentValues values = new ContentValues();
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.EVENT_ID, eventId);
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.BEGIN, begin);
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.END, end);
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.ALARM_TIME, alarmTime);
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long currentTime = System.currentTimeMillis();
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.CREATION_TIME, currentTime);
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.RECEIVED_TIME, 0);
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.NOTIFY_TIME, 0);
2062083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik            values.put(CalendarAlerts.STATE, STATE_SCHEDULED);
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(CalendarAlerts.MINUTES, minutes);
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cr.insert(CONTENT_URI, values);
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2067c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Finds the next alarm after (or equal to) the given time and returns
2069c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * the time of that alarm or -1 if no such alarm exists. This is a
2070083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * blocking call and should not be done on the UI thread. TODO move to
2071083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * provider
20725b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff         *
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cr the ContentResolver
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param millis the time in UTC milliseconds
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return the next alarm time greater than or equal to "millis", or -1
2076c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *         if no such alarm exists.
2077083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final long findNextAlarmTime(ContentResolver cr, long millis) {
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String selection = ALARM_TIME + ">=" + millis;
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: construct an explicit SQL query so that we can add
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // "LIMIT 1" to the end and get just one result.
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] projection = new String[] { ALARM_TIME };
2084083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik            Cursor cursor = cr.query(CONTENT_URI, projection, WHERE_FINDNEXTALARMTIME,
2085083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    (new String[] {
20861dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio                        Long.toString(millis)
2087083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    }), SORT_ORDER_ALARMTIME_ASC);
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long alarmTime = -1;
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cursor != null && cursor.moveToFirst()) {
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    alarmTime = cursor.getLong(0);
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cursor != null) {
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cursor.close();
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return alarmTime;
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21005b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Searches the CalendarAlerts table for alarms that should have fired
2103083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * but have not and then reschedules them. This method can be called at
2104083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * boot time to restore alarms that may have been lost due to a phone
2105083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * reboot. TODO move to provider
21065b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff         *
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cr the ContentResolver
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param context the Context
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param manager the AlarmManager
2110083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final void rescheduleMissedAlarms(ContentResolver cr,
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Context context, AlarmManager manager) {
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Get all the alerts that have been scheduled but have not fired
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // and should have fired by now and are not too old.
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long now = System.currentTimeMillis();
2117cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            long ancient = now - DateUtils.DAY_IN_MILLIS;
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] projection = new String[] {
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ALARM_TIME,
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
2121cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2122cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            // TODO: construct an explicit SQL query so that we can add
2123cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            // "GROUPBY" instead of doing a sort and de-dup
2124083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik            Cursor cursor = cr.query(CalendarAlerts.CONTENT_URI, projection,
2125083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    WHERE_RESCHEDULE_MISSED_ALARMS, (new String[] {
2126083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                            Long.toString(now), Long.toString(ancient), Long.toString(now)
2127083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    }), SORT_ORDER_ALARMTIME_ASC);
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cursor == null) {
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2131cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2132cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            if (DEBUG) {
2133105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                Log.d(TAG, "missed alarms found: " + cursor.getCount());
2134105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
21355b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
2137cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                long alarmTime = -1;
2138cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (cursor.moveToNext()) {
2140cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                    long newAlarmTime = cursor.getLong(0);
2141cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                    if (alarmTime != newAlarmTime) {
2142cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                        if (DEBUG) {
2143cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                            Log.w(TAG, "rescheduling missed alarm. alarmTime: " + newAlarmTime);
2144cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                        }
2145cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                        scheduleAlarm(context, manager, newAlarmTime);
2146cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                        alarmTime = newAlarmTime;
2147cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                    }
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cursor.close();
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2152cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan        }
2153cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2154c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        /**
2155c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * Schedules an alarm intent with the system AlarmManager that will
21563771fcbc192386d96b57d1edec44d53620d9f09dRoboErik         * notify listeners when a reminder should be fired. The provider will
21573771fcbc192386d96b57d1edec44d53620d9f09dRoboErik         * keep scheduled reminders up to date but apps may use this to
21583771fcbc192386d96b57d1edec44d53620d9f09dRoboErik         * implement snooze functionality without modifying the reminders table.
21593771fcbc192386d96b57d1edec44d53620d9f09dRoboErik         * Scheduled alarms will generate an intent using
2160083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * {@link #ACTION_EVENT_REMINDER}. TODO Move to provider
2161c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *
2162c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param context A context for referencing system resources
2163c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param manager The AlarmManager to use or null
2164c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * @param alarmTime The time to fire the intent in UTC millis since
2165c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         *            epoch
2166083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
2167c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         */
2168cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan        public static void scheduleAlarm(Context context, AlarmManager manager, long alarmTime) {
2169cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            if (DEBUG) {
2170cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                Time time = new Time();
2171cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                time.set(alarmTime);
2172cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                String schedTime = time.format(" %a, %b %d, %Y %I:%M%P");
2173cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                Log.d(TAG, "Schedule alarm at " + alarmTime + " " + schedTime);
2174cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            }
2175cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan
2176cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            if (manager == null) {
2177cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan                manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
2178cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            }
21795b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
2180e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik            Intent intent = new Intent(ACTION_EVENT_REMINDER);
2181bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik            intent.setData(ContentUris.withAppendedId(CalendarContract.CONTENT_URI, alarmTime));
21821dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio            intent.putExtra(ALARM_TIME, alarmTime);
218342f1957817c3bda0c002e2c987f2a8bbe320f755Erik            PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
2184cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan            manager.set(AlarmManager.RTC_WAKEUP, alarmTime, pi);
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21865b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2188083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * Searches for an entry in the CalendarAlerts table that matches the
2189083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * given event id, begin time and alarm time. If one is found then this
2190083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * alarm already exists and this method returns true. TODO Move to
2191083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * provider
219258644028f909ecb429b26f909bedfb62a153d4e4RoboErik         *
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cr the ContentResolver
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param eventId the event id to match
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param begin the start time of the event in UTC millis
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param alarmTime the alarm time of the event in UTC millis
2197083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @return true if there is already an alarm for the given event with
2198083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         *         the same start time and alarm time.
2199083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik         * @hide
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final boolean alarmExists(ContentResolver cr, long eventId,
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long begin, long alarmTime) {
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: construct an explicit SQL query so that we can add
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // "LIMIT 1" to the end and get just one result.
22051dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio            String[] projection = new String[] { ALARM_TIME };
2206083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik            Cursor cursor = cr.query(CONTENT_URI, projection, WHERE_ALARM_EXISTS,
2207083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    (new String[] {
2208083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                            Long.toString(eventId), Long.toString(begin), Long.toString(alarmTime)
2209083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik                    }), null);
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean found = false;
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cursor != null && cursor.getCount() > 0) {
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    found = true;
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cursor != null) {
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cursor.close();
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return found;
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2224b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface ExtendedPropertiesColumns {
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2226c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The event the extended property belongs to. Column name.
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (foreign key to the Events table)</P>
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String EVENT_ID = "event_id";
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The name of the extended property.  This is a uri of the form
2233c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * {scheme}#{local-name} convention. Column name.
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NAME = "name";
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2239c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The value of the extended property. Column name.
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String VALUE = "value";
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2245c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
2246c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * Fields for accessing the Extended Properties. This is a generic set of
2247c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * name/value pairs for use by sync adapters or apps to add extra
22483771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * information to events. There are three writable columns and all three
22493771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * must be present when inserting a new value. They are:
22503771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <ul>
22513771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #EVENT_ID}</li>
22523771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #NAME}</li>
22533771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * <li>{@link #VALUE}</li>
22543771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * </ul>
2255c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   public static final class ExtendedProperties implements BaseColumns,
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ExtendedPropertiesColumns, EventsColumns {
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri CONTENT_URI =
2259a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff                Uri.parse("content://" + AUTHORITY + "/extendedproperties");
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22613672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
22623672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
22633672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
22643672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private ExtendedProperties() {}
22653672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: fill out this class when we actually start utilizing extendedproperties
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // in the calendar application.
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   }
2269ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff
2270ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff    /**
2271ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff     * A table provided for sync adapters to use for storing private sync state data.
2272ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff     *
2273ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff     * @see SyncStateContract
2274ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff     */
2275ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff    public static final class SyncState implements SyncStateContract.Columns {
2276ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff        /**
2277ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff         * This utility class cannot be instantiated
2278ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff         */
2279ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff        private SyncState() {}
2280ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff
2281c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik        private static final String CONTENT_DIRECTORY =
2282ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff                SyncStateContract.Constants.CONTENT_DIRECTORY;
2283ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff
2284ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff        /**
2285ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff         * The content:// style URI for this table
2286ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff         */
2287ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff        public static final Uri CONTENT_URI =
2288bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik                Uri.withAppendedPath(CalendarContract.CONTENT_URI, CONTENT_DIRECTORY);
2289ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff    }
2290505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2291505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    /**
2292505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio     * Columns from the EventsRawTimes table
22933771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     *
22943771fcbc192386d96b57d1edec44d53620d9f09dRoboErik     * @hide
2295505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio     */
2296b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik    protected interface EventsRawTimesColumns {
2297505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2298c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The corresponding event id. Column name.
2299505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: INTEGER (long)</P>
2300505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2301505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String EVENT_ID = "event_id";
2302505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2303505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2304c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The RFC2445 compliant time the event starts. Column name.
2305505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: TEXT</P>
2306505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2307505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String DTSTART_2445 = "dtstart2445";
2308505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2309505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2310c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The RFC2445 compliant time the event ends. Column name.
2311505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: TEXT</P>
2312505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2313505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String DTEND_2445 = "dtend2445";
2314505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2315505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2316c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The RFC2445 compliant original instance time of the recurring event
2317c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * for which this event is an exception. Column name.
2318505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: TEXT</P>
2319505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2320505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String ORIGINAL_INSTANCE_TIME_2445 = "originalInstanceTime2445";
2321505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2322505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        /**
2323c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * The RFC2445 compliant last date this event repeats on, or NULL if it
2324c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik         * never ends. Column name.
2325505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         * <P>Type: TEXT</P>
2326505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio         */
2327505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio        public static final String LAST_DATE_2445 = "lastDate2445";
2328505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    }
2329505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio
2330c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik    /**
2331c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     * @hide
2332c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik     */
2333505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    public static final class EventsRawTimes implements BaseColumns, EventsRawTimesColumns {
23343672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik
23353672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        /**
23363672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         * This utility class cannot be instantiated
23373672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik         */
23383672696dc542674f8b54f83cd00c616b4a9fd4adRoboErik        private EventsRawTimes() {}
2339505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio    }
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2341