CalendarContract.java revision 58644028f909ecb429b26f909bedfb62a153d4e4
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 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.AlarmManager; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent; 2264a556d755d27b1182897e9243cf4f3016e76a88Marc Blankimport android.content.ContentProviderClient; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentUris; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 27328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintanaimport android.content.CursorEntityIterator; 28328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintanaimport android.content.Entity; 2964a556d755d27b1182897e9243cf4f3016e76a88Marc Blankimport android.content.EntityIterator; 3064a556d755d27b1182897e9243cf4f3016e76a88Marc Blankimport android.content.Intent; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 32328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintanaimport android.database.DatabaseUtils; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 34cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chanimport android.os.RemoteException; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.format.DateUtils; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.format.Time; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 40260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <p> 41260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * The contract between the calendar provider and applications. Contains 42260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * definitions for the supported URIs and data columns. 43260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </p> 44260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <h3>Overview</h3> 45260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <p> 46260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * CalendarContract defines the data model of calendar and event related 47260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * information. This data is stored in a number of tables: 48260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </p> 49260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <ul> 50260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Calendars} table holds the calendar specific information. Each 51260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * row in this table contains the details for a single calendar, such as the 52260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * name, color, sync info, etc.</li> 53260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Events} table holds the event specific information. Each row 54260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * in this table has the info for a single event. It contains information such 55260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * as event title, location, start time, end time, etc. The event can occur 56260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * one-time or can recur multiple times. Attendees, reminders, and extended 57260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * properties are stored on separate tables and reference the {@link Events#_ID} 58260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * to link them with the event.</li> 59260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Instances} table holds the start and end time for occurrences 60260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * of an event. Each row in this table represents a single occurrence. For 61260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * one-time events there will be a 1:1 mapping of instances to events. For 62260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * recurring events, multiple rows will automatically be generated which 63260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * correspond to multiple occurrences of that event.</li> 64260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Attendees} table holds the event attendee or guest 65260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * information. Each row represents a single guest of an event. It specifies the 66260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * type of guest they are and their attendance response for the event.</li> 67260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link Reminders} table holds the alert/notification data. Each row 68260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * represents a single alert for an event. An event can have multiple reminders. 69260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * The number of reminders per event is specified in 70260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * {@link Calendars#MAX_REMINDERS} which is set by the Sync Adapter that owns 71260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * the given calendar. Reminders are specified in minutes before the event and 72260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * have a type.</li> 73260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li>The {@link ExtendedProperties} table hold opaque data fields used by the 74260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * sync adapter. The provider takes no action with items in this table except to 75260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * delete them when their related events are deleted.</li> 76260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </ul> 77260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <p> 78260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * Other tables include: 79260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </p> 80260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <ul> 81260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * <li> 82260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * {@link SyncState}, which contains free-form data maintained by the sync 83260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * adapters</li> 84260598d0cfb1f4f31fe698b6ceaeb0f4d2009e61RoboErik * </ul> 85bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik * 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 88bec6c36b96f7bc415af18abbb142bd51a1741796RoboErikpublic final class CalendarContract { 89c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik private static final String TAG = "Calendar"; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 92c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Broadcast Action: This is the intent that gets fired when an alarm 93c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * notification needs to be posted for a reminder. 94083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * 95083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * @SdkConstant 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 97e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik public static final String ACTION_EVENT_REMINDER = "android.intent.action.EVENT_REMINDER"; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 100c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Intent Extras key: The start time of an event or an instance of a 101c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * recurring event. (milliseconds since epoch) 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 103e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik public static final String EXTRA_EVENT_BEGIN_TIME = "beginTime"; 104c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik 105c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 106c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Intent Extras key: The end time of an event or an instance of a recurring 107c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * event. (milliseconds since epoch) 108c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 109e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik public static final String EXTRA_EVENT_END_TIME = "endTime"; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 111e9b734dff148d8e70a9604c81d162144becdc45dErik /** 112c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * This authority is used for writing to or querying from the calendar 113c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * provider. Note: This is set at first run and cannot be changed without 114c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * breaking apps that access the provider. 115e9b734dff148d8e70a9604c81d162144becdc45dErik */ 1161790c13ed68a3fc1f8d91d636caae422a19b1a2aKen Shirriff public static final String AUTHORITY = "com.android.calendar"; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URL for the top-level calendar authority 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 121083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1245b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff * An optional insert, update or delete URI parameter that allows the caller 125c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * to specify that it is a sync adapter. The default value is false. If set 126c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * to true, the modified row is not marked as "dirty" (needs to be synced) 127c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * and when the provider calls 128c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * {@link ContentResolver#notifyChange(android.net.Uri, android.database.ContentObserver, boolean)} 129c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * , the third parameter "syncToNetwork" is set to false. Furthermore, if 130c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * set to true, the caller must also include 1316f5b4550450d98bb2ae4ac93cefd4133e2a71847Andy McFadden * {@link Calendars#ACCOUNT_NAME} and {@link Calendars#ACCOUNT_TYPE} as 132c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * query parameters. 133c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 1346f5b4550450d98bb2ae4ac93cefd4133e2a71847Andy McFadden * @see Uri.Builder#appendQueryParameter(java.lang.String, java.lang.String) 1355b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff */ 1365b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff public static final String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter"; 1375b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff 138c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 139c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * A special account type for calendars not associated with any account. 140c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Normally calendars that do not match an account on the device will be 141c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * removed. Setting the account_type on a calendar to this will prevent it 142c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * from being wiped if it does not match an existing account. 143c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 144c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @see SyncColumns#ACCOUNT_TYPE 145c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 146c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik public static final String ACCOUNT_TYPE_LOCAL = "LOCAL"; 147c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 1485b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff /** 149c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Generic columns for use by sync adapters. The specific functions of these 150c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * columns are private to the sync adapter. Other clients of the API should 151c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * not attempt to either read or write this column. These columns are 152c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * editable as part of the Calendars Uri, but can only be read if accessed 153c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * through any other Uri. 15436f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio */ 155c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik protected interface CalendarSyncColumns { 15636f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio 1579734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 1589734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 1599734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Generic column for use by sync adapters. Column name. 1609734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 1619734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 162be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik public static final String CAL_SYNC1 = "cal_sync1"; 1639734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 1649734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 1659734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Generic column for use by sync adapters. Column name. 1669734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 1679734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 168be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik public static final String CAL_SYNC2 = "cal_sync2"; 1699734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 1709734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 1719734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Generic column for use by sync adapters. Column name. 1729734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 1739734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 174be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik public static final String CAL_SYNC3 = "cal_sync3"; 1759734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 1769734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 1779734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Generic column for use by sync adapters. Column name. 1789734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 1799734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 180be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik public static final String CAL_SYNC4 = "cal_sync4"; 1819734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 1829734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 1839734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Generic column for use by sync adapters. Column name. 1849734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 1859734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 186be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik public static final String CAL_SYNC5 = "cal_sync5"; 1879734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 1889734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 1899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Generic column for use by sync adapters. Column name. 1909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 1919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 192be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik public static final String CAL_SYNC6 = "cal_sync6"; 1939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 1949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 1959734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Generic column for use by sync adapters. Column name. 1969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 1979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 1989734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String CAL_SYNC7 = "cal_sync7"; 1999734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 2009734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 2019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Generic column for use by sync adapters. Column name. 2029734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 2039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 2049734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String CAL_SYNC8 = "cal_sync8"; 2059734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 2069734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 2079734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Generic column for use by sync adapters. Column name. 2089734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 2099734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 2109734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String CAL_SYNC9 = "cal_sync9"; 2119734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 2129734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 2139734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Generic column for use by sync adapters. Column name. 2149734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 2159734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 2169734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String CAL_SYNC10 = "cal_sync10"; 21736f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio } 21836f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio 21936f7784a4cb45845ed7725c0cc6d7022682f00b3Fabrice Di Meglio /** 220c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Columns for Sync information used by Calendars and Events tables. These 221c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * have specific uses which are expected to be consistent by the app and 222c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * sync adapter. 223c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2250025860b61c1b9e8e7d1da7edd7a8ad837b87078RoboErik protected interface SyncColumns extends CalendarSyncColumns { 226328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana /** 227c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The account that was used to sync the entry to the device. If the 228c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * account_type is not {@link #ACCOUNT_TYPE_LOCAL} then the name and 229c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * type must match an account on the device or the calendar will be 230c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * deleted. 231328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana * <P>Type: TEXT</P> 232328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana */ 233651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final String ACCOUNT_NAME = "account_name"; 234328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 235328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana /** 236c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The type of the account that was used to sync the entry to the 237c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * device. A type of {@link #ACCOUNT_TYPE_LOCAL} will keep this event 238c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * form being deleted if there are no matching accounts on the device. 239328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana * <P>Type: TEXT</P> 240328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana */ 241651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final String ACCOUNT_TYPE = "account_type"; 242328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 243328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana /** 244c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The unique ID for a row assigned by the sync source. NULL if the row 245c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * has never been synced. This is used as a reference id for exceptions 246c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * along with {@link BaseColumns#_ID}. 247328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana * <P>Type: TEXT</P> 248328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana */ 249328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana public static final String _SYNC_ID = "_sync_id"; 250328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 251328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana /** 2529734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Used to indicate that local, unsynced, changes are present. 253328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana * <P>Type: INTEGER (long)</P> 254328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana */ 2559734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String DIRTY = "dirty"; 256328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 257328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana /** 2589734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Whether the row has been deleted but not synced to the server. A 2599734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * deleted row should be ignored. 2609734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P> 2619734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Type: INTEGER (boolean) 2629734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * </P> 263328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana */ 2649734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String DELETED = "deleted"; 26515049e46f7331b64bd3093e1d9a0365ca5caf3aeKen Shirriff 266866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert /** 267866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert * If set to 1 this causes events on this calendar to be duplicated with 2680025860b61c1b9e8e7d1da7edd7a8ad837b87078RoboErik * {@link Events#LAST_SYNCED} set to 1 whenever the event 2699734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * transitions from non-dirty to dirty. The duplicated event will not be 2709734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * expanded in the instances table and will only show up in sync adapter 2719734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * queries of the events table. It will also be deleted when the 272866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert * originating event has its dirty flag cleared by the sync adapter. 273866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert * <P>Type: INTEGER (boolean)</P> 274866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert */ 275866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert public static final String CAN_PARTIALLY_UPDATE = "canPartiallyUpdate"; 276c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio } 277c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 278c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** 279c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Columns specific to the Calendars Uri that other Uris can query. 280c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio */ 281e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik protected interface CalendarColumns { 282c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** 283c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio * The color of the calendar 284c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio * <P>Type: INTEGER (color value)</P> 285c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio */ 286651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final String CALENDAR_COLOR = "calendar_color"; 287c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 288c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** 2899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * The display name of the calendar. Column name. 2909734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 2919734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 2929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String CALENDAR_DISPLAY_NAME = "calendar_displayName"; 2939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 2949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 295c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio * The level of access that the user has for the calendar 296c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio * <P>Type: INTEGER (one of the values below)</P> 297c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio */ 2989734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String CALENDAR_ACCESS_LEVEL = "calendar_access_level"; 299c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 300c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** Cannot access the calendar */ 3019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final int CAL_ACCESS_NONE = 0; 302c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** Can only see free/busy information about the calendar */ 3039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final int CAL_ACCESS_FREEBUSY = 100; 304c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** Can read all event details */ 3059734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final int CAL_ACCESS_READ = 200; 306c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** Can reply yes/no/maybe to an event */ 3079734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final int CAL_ACCESS_RESPOND = 300; 308c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** not used */ 3099734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final int CAL_ACCESS_OVERRIDE = 400; 310c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** Full access to modify the calendar, but not the access control 311c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * settings 312c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 3139734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final int CAL_ACCESS_CONTRIBUTOR = 500; 314c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** Full access to modify the calendar, but not the access control 315c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * settings 316c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 3179734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final int CAL_ACCESS_EDITOR = 600; 318c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** Full access to the calendar */ 3199734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final int CAL_ACCESS_OWNER = 700; 320c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** Domain admin */ 3219734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final int CAL_ACCESS_ROOT = 800; 322c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 323c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** 324c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio * Is the calendar selected to be displayed? 325c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 0 - do not show events associated with this calendar. 326c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 1 - show events associated with this calendar 327c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio * <P>Type: INTEGER (boolean)</P> 328c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio */ 329df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden public static final String VISIBLE = "visible"; 330c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 331c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** 332c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The time zone the calendar is associated with. 333c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio * <P>Type: TEXT</P> 334c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio */ 3359734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String CALENDAR_TIME_ZONE = "calendar_timezone"; 336c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 337c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** 338c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Is this calendar synced and are its events stored on the device? 339c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 0 - Do not sync this calendar or store events for this calendar. 340c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 1 - Sync down events for this calendar. 341c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio * <p>Type: INTEGER (boolean)</p> 342c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio */ 343c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio public static final String SYNC_EVENTS = "sync_events"; 344c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 345c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** 3469734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * The owner account for this calendar, based on the calendar feed. 3479734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * This will be different from the _SYNC_ACCOUNT for delegated calendars. 3489734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Column name. 3499734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: String</P> 350c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio */ 3519734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String OWNER_ACCOUNT = "ownerAccount"; 352c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 353c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** 3549734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Can the organizer respond to the event? If no, the status of the 3559734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * organizer should not be shown by the UI. Defaults to 1. Column name. 356c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio * <P>Type: INTEGER (boolean)</P> 357c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio */ 3589734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String CAN_ORGANIZER_RESPOND = "canOrganizerRespond"; 3599734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 3609734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 3619734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * Can the organizer modify the time zone of the event? Column name. 3629734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: INTEGER (boolean)</P> 3639734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 3649734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String CAN_MODIFY_TIME_ZONE = "canModifyTimeZone"; 3659734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 3669734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 3679734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * The maximum number of reminders allowed for an event. Column name. 3689734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: INTEGER</P> 3699734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 3709734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String MAX_REMINDERS = "maxReminders"; 3719734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 3729734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 3739734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * A comma separated list of reminder methods supported for this 3749734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * calendar in the format "#,#,#". Valid types are 3759734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * {@link Reminders#METHOD_DEFAULT}, {@link Reminders#METHOD_ALERT}, 3769734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * {@link Reminders#METHOD_EMAIL}, {@link Reminders#METHOD_SMS}. Column 3779734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * name. 3789734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 3799734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 3809734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String ALLOWED_REMINDERS = "allowedReminders"; 381c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio } 382c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 383c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** 384c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio * Class that represents a Calendar Entity. There is one entry per calendar. 385c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * This is a helper class to make batch operations easier. 386c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio */ 387e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik public static class CalendarEntity implements BaseColumns, SyncColumns, CalendarColumns { 388c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 389c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 390c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The default Uri used when creating a new calendar EntityIterator. 391c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 392c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik @SuppressWarnings("hiding") 393c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + 394c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio "/calendar_entities"); 395c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 396c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 397c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Creates an entity iterator for the given cursor. It assumes the 398c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * cursor contains a calendars query. 399c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 400c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param cursor query on {@link #CONTENT_URI} 401c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @return an EntityIterator of calendars 402c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 403c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik public static EntityIterator newEntityIterator(Cursor cursor) { 404c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik return new EntityIteratorImpl(cursor); 405c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio } 406c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 407c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio private static class EntityIteratorImpl extends CursorEntityIterator { 408c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 409c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik public EntityIteratorImpl(Cursor cursor) { 410c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio super(cursor); 411c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio } 412c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 413c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio @Override 414c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio public Entity getEntityAndIncrementCursor(Cursor cursor) throws RemoteException { 415c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio // we expect the cursor is already at the row we need to read from 416c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio final long calendarId = cursor.getLong(cursor.getColumnIndexOrThrow(_ID)); 417c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 418c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio // Create the content value 419c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio ContentValues cv = new ContentValues(); 420c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio cv.put(_ID, calendarId); 421c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 422651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ACCOUNT_NAME); 423651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ACCOUNT_TYPE); 424c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 425c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_ID); 426651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DIRTY); 427c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 4289734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC1); 4299734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC2); 4309734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC3); 4319734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC4); 4329734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC5); 4339734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC6); 4349734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC7); 4359734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC8); 4369734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC9); 4379734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC10); 438c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 439c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, Calendars.NAME); 440c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, 4419734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik Calendars.CALENDAR_DISPLAY_NAME); 442866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, 443866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert Calendars.CALENDAR_COLOR); 4449734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, CALENDAR_ACCESS_LEVEL); 445df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, VISIBLE); 446c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, SYNC_EVENTS); 447651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, 448651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik Calendars.CALENDAR_LOCATION); 4499734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CALENDAR_TIME_ZONE); 450c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, 451c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio Calendars.OWNER_ACCOUNT); 452c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, 453df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden Calendars.CAN_ORGANIZER_RESPOND); 454df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, 455df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden Calendars.CAN_MODIFY_TIME_ZONE); 456df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, 457df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden Calendars.MAX_REMINDERS); 458866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, 459866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert Calendars.CAN_PARTIALLY_UPDATE); 4609734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, 4619734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik Calendars.ALLOWED_REMINDERS); 462c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 463c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, DELETED); 464c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 465c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio // Create the Entity from the ContentValue 466c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio Entity entity = new Entity(cv); 467c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 468c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio // Set cursor to next row 469c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio cursor.moveToNext(); 470c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 471c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio // Return the created Entity 472c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio return entity; 473c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio } 474c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio } 475c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio } 476c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio 477c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** 478f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * Constants and helpers for the Calendars table, which contains details for 479f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * individual calendars. <h3>Operations</h3> All operations can be done 480f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * either as an app or as a sync adapter. To perform an operation as a sync 481f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * adapter {@link #CALLER_IS_SYNCADAPTER} should be set to true and 482f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * {@link #ACCOUNT_NAME} and {@link #ACCOUNT_TYPE} must be set in the Uri 483f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * parameters. See 484f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * {@link Uri.Builder#appendQueryParameter(java.lang.String, java.lang.String)} 485f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * for details on adding parameters. Sync adapters have write access to more 486f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * columns but are restricted to a single account at a time. Calendars are 487f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * designed to be primarily managed by a sync adapter and inserting new 488f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * calendars should be done as a sync adapter. For the most part, apps 489f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * should only update calendars (such as changing the color or display 490f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * name). If a local calendar is required an app can do so by inserting as a 491f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * sync adapter and using an {@link #ACCOUNT_TYPE} of 492f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * {@link #ACCOUNT_TYPE_LOCAL} . 493f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <dl> 494f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <dt><b>Insert</b></dt> 495f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <dd>When inserting a new calendar the following fields must be included: 496f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <ul> 497f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #ACCOUNT_NAME}</li> 498f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #ACCOUNT_TYPE}</li> 499f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #NAME}</li> 500f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CALENDAR_DISPLAY_NAME}</li> 501f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CALENDAR_COLOR}</li> 502f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CALENDAR_ACCESS_LEVEL}</li> 503f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #OWNER_ACCOUNT}</li> 504f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * </ul> 505f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * The following fields are not required when inserting a Calendar but are 506f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * generally a good idea to include: 507f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <ul> 508f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #SYNC_EVENTS} set to 1</li> 509f92ccfb8b0e2062e5170ea649cdc01692b09a683RoboErik * <li>{@link #CALENDAR_TIME_ZONE}</li> 510f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #ALLOWED_REMINDERS}</li> 511f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * </ul> 512f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <dt><b>Update</b></dt> 513f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <dd>To perform an update on a calendar the {@link #_ID} of the calendar 514f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * should be provided either as an appended id to the Uri ( 515f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * {@link ContentUris#withAppendedId}) or as the first selection item--the 516f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * selection should start with "_id=?" and the first selectionArg should be 517f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * the _id of the calendar. Calendars may also be updated using a selection 518f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * without the id. In general, the {@link #ACCOUNT_NAME} and 519f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * {@link #ACCOUNT_TYPE} should not be changed after a calendar is created 520f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * as this can cause issues for sync adapters. 521f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <dt><b>Delete</b></dt> 522f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <dd>Calendars can be deleted either by the {@link #_ID} as an appended id 523f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * on the Uri or using any standard selection. Deleting a calendar should 524f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * generally be handled by a sync adapter as it will remove the calendar 525f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * from the database and all associated data (aka events).</dd> 526f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <dt><b>Query</b></dt> 527f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <dd>Querying the Calendars table will get you all information about a set 528f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * of calendars. There will be one row returned for each calendar that 529f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * matches the query selection, or at most a single row if the {@link #_ID} 530f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * is appended to the Uri.</dd> 531f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * </dl> 532f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <h3>Calendar Columns</h3> The following Calendar columns are writable by 533f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * both an app and a sync adapter. 534f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <ul> 535f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #NAME}</li> 536f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CALENDAR_DISPLAY_NAME}</li> 537f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CALENDAR_COLOR}</li> 538f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #VISIBLE}</li> 539f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #SYNC_EVENTS}</li> 540f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * </ul> 541f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * The following Calendars columns are writable only by a sync adapter 542f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <ul> 543f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #ACCOUNT_NAME}</li> 544f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #ACCOUNT_TYPE}</li> 545f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #_SYNC_ID}</li> 546f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #DIRTY}</li> 547f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #OWNER_ACCOUNT}</li> 548f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #MAX_REMINDERS}</li> 549f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #ALLOWED_REMINDERS}</li> 550f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAN_MODIFY_TIME_ZONE}</li> 551f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAN_ORGANIZER_RESPOND}</li> 552f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAN_PARTIALLY_UPDATE}</li> 553f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CALENDAR_LOCATION}</li> 554f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CALENDAR_TIME_ZONE}</li> 555f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CALENDAR_ACCESS_LEVEL}</li> 556f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #DELETED}</li> 557f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAL_SYNC1}</li> 558f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAL_SYNC2}</li> 559f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAL_SYNC3}</li> 560f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAL_SYNC4}</li> 561f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAL_SYNC5}</li> 562f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAL_SYNC6}</li> 563f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAL_SYNC7}</li> 564f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAL_SYNC8}</li> 565f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAL_SYNC9}</li> 566f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <li>{@link #CAL_SYNC10}</li> 567f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * </ul> 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik public static class Calendars implements BaseColumns, SyncColumns, CalendarColumns { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 571c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The content:// style URL for accessing Calendars 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 573c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik @SuppressWarnings("hiding") 5741dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/calendars"); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DEFAULT_SORT_ORDER = "displayName"; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 582c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The name of the calendar. Column name. 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NAME = "name"; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 588c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The default location for the calendar. Column name. 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 591651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final String CALENDAR_LOCATION = "calendar_location"; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5946efb30f40a19a9639076b08df4f64d335c8946a0RoboErik * These fields are only writable by a sync adapter. To modify them the 595c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * caller must include {@link #CALLER_IS_SYNCADAPTER}, 5969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * {@link #ACCOUNT_NAME}, and {@link #ACCOUNT_TYPE} in the Uri's query 597083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * parameters. TODO move to provider 598083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * 599083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * @hide 6006efb30f40a19a9639076b08df4f64d335c8946a0RoboErik */ 6016efb30f40a19a9639076b08df4f64d335c8946a0RoboErik public static final String[] SYNC_WRITABLE_COLUMNS = new String[] { 602651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik ACCOUNT_NAME, 603651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik ACCOUNT_TYPE, 6046efb30f40a19a9639076b08df4f64d335c8946a0RoboErik _SYNC_ID, 605651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik DIRTY, 6066efb30f40a19a9639076b08df4f64d335c8946a0RoboErik OWNER_ACCOUNT, 6076efb30f40a19a9639076b08df4f64d335c8946a0RoboErik MAX_REMINDERS, 608f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik ALLOWED_REMINDERS, 6096efb30f40a19a9639076b08df4f64d335c8946a0RoboErik CAN_MODIFY_TIME_ZONE, 6106efb30f40a19a9639076b08df4f64d335c8946a0RoboErik CAN_ORGANIZER_RESPOND, 611866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert CAN_PARTIALLY_UPDATE, 612651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik CALENDAR_LOCATION, 6139734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CALENDAR_TIME_ZONE, 6149734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CALENDAR_ACCESS_LEVEL, 6156efb30f40a19a9639076b08df4f64d335c8946a0RoboErik DELETED, 616be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik CAL_SYNC1, 617be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik CAL_SYNC2, 618be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik CAL_SYNC3, 619be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik CAL_SYNC4, 620c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik CAL_SYNC5, 621c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik CAL_SYNC6, 6229734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CAL_SYNC7, 6239734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CAL_SYNC8, 6249734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CAL_SYNC9, 6259734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CAL_SYNC10, 6266efb30f40a19a9639076b08df4f64d335c8946a0RoboErik }; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio /** 630c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio * Columns from the Attendees table that other tables join into themselves. 631c3cc13306c69e4f354b7b230698eaa0b90bba454Fabrice Di Meglio */ 632b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik protected interface AttendeesColumns { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 635c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The id of the event. Column name. 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EVENT_ID = "event_id"; 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 641c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The name of the attendee. Column name. 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: STRING</P> 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ATTENDEE_NAME = "attendeeName"; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 647c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The email address of the attendee. Column name. 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: STRING</P> 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ATTENDEE_EMAIL = "attendeeEmail"; 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 653c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The relationship of the attendee to the user. Column name. 654c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * <P>Type: INTEGER (one of {@link #RELATIONSHIP_ATTENDEE}, ...}.</P> 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ATTENDEE_RELATIONSHIP = "attendeeRelationship"; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int RELATIONSHIP_NONE = 0; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int RELATIONSHIP_ATTENDEE = 1; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int RELATIONSHIP_ORGANIZER = 2; 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int RELATIONSHIP_PERFORMER = 3; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int RELATIONSHIP_SPEAKER = 4; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 665c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The type of attendee. Column name. 666c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * <P>Type: Integer (one of {@link #TYPE_REQUIRED}, {@link #TYPE_OPTIONAL})</P> 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ATTENDEE_TYPE = "attendeeType"; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TYPE_NONE = 0; 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TYPE_REQUIRED = 1; 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TYPE_OPTIONAL = 2; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 675c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The attendance status of the attendee. Column name. 676c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * <P>Type: Integer (one of {@link #ATTENDEE_STATUS_ACCEPTED}, ...).</P> 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ATTENDEE_STATUS = "attendeeStatus"; 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ATTENDEE_STATUS_NONE = 0; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ATTENDEE_STATUS_ACCEPTED = 1; 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ATTENDEE_STATUS_DECLINED = 2; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ATTENDEE_STATUS_INVITED = 3; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ATTENDEE_STATUS_TENTATIVE = 4; 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 687c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 6883771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * Fields and helpers for interacting with Attendees. Each row of this table 6893771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * represents a single attendee or guest of an event. Calling 69058644028f909ecb429b26f909bedfb62a153d4e4RoboErik * {@link #query(ContentResolver, long, String[])} will return a list of attendees for 6913771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * the event with the given eventId. Both apps and sync adapters may write 6923771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * to this table. There are six writable fields and all of them except 6933771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * {@link #ATTENDEE_NAME} must be included when inserting a new attendee. 6943771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * They are: 6953771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <ul> 6963771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <li>{@link #EVENT_ID}</li> 6973771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <li>{@link #ATTENDEE_NAME}</li> 6983771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <li>{@link #ATTENDEE_EMAIL}</li> 6993771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <li>{@link #ATTENDEE_RELATIONSHIP}</li> 7003771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <li>{@link #ATTENDEE_TYPE}</li> 7013771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <li>{@link #ATTENDEE_STATUS}</li> 7023771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * </ul> 703c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 7041dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio public static final class Attendees implements BaseColumns, AttendeesColumns, EventsColumns { 705c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik 706c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 707c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The content:// style URL for accessing Attendees data 708c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 709c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik @SuppressWarnings("hiding") 7101dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/attendees"); 711c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik private static final String ATTENDEES_WHERE = Attendees.EVENT_ID + "=?"; 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 713c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 714c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Queries all attendees associated with the given event. This is a 715c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * blocking call and should not be done on the UI thread. 71658644028f909ecb429b26f909bedfb62a153d4e4RoboErik * 717c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param cr The content resolver to use for the query 718c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param eventId The id of the event to retrieve attendees for 71958644028f909ecb429b26f909bedfb62a153d4e4RoboErik * @param projection the columns to return in the cursor 720c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @return A Cursor containing all attendees for the event 721c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 72258644028f909ecb429b26f909bedfb62a153d4e4RoboErik public static final Cursor query(ContentResolver cr, long eventId, String[] projection) { 723c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik String[] attArgs = {Long.toString(eventId)}; 72458644028f909ecb429b26f909bedfb62a153d4e4RoboErik return cr.query(CONTENT_URI, projection, ATTENDEES_WHERE, attArgs /* selection args */, 725c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik null /* sort order */); 726c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik } 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Columns from the Events table that other tables join into themselves. 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 732b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik protected interface EventsColumns { 733df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden 734df2e2c89d82219eb630091c1329fd2bd8c04ec22Andy McFadden /** 735c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The {@link Calendars#_ID} of the calendar the event belongs to. 736c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Column name. 737c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * <P>Type: INTEGER</P> 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CALENDAR_ID = "calendar_id"; 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 742c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The title of the event. Column name. 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TITLE = "title"; 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 748c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The description of the event. Column name. 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DESCRIPTION = "description"; 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 754c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Where the event takes place. Column name. 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EVENT_LOCATION = "eventLocation"; 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7609734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * A secondary color for the individual event. Column name. 7619734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: INTEGER</P> 7629734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 7639734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String EVENT_COLOR = "eventColor"; 7649734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 7659734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 766c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The event status. Column name. 767c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * <P>Type: INTEGER (one of {@link #STATUS_TENTATIVE}...)</P> 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String STATUS = "eventStatus"; 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATUS_TENTATIVE = 0; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATUS_CONFIRMED = 1; 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATUS_CANCELED = 2; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a copy of the attendee status for the owner of this event. 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field is copied here so that we can efficiently filter out 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * events that are declined without having to look in the Attendees 779c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * table. Column name. 7805b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff * 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (int)</P> 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SELF_ATTENDEE_STATUS = "selfAttendeeStatus"; 7845b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 786c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * This column is available for use by sync adapters. Column name. 78764a556d755d27b1182897e9243cf4f3016e76a88Marc Blank * <P>Type: TEXT</P> 78864a556d755d27b1182897e9243cf4f3016e76a88Marc Blank */ 789651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final String SYNC_DATA1 = "sync_data1"; 79064a556d755d27b1182897e9243cf4f3016e76a88Marc Blank 79164a556d755d27b1182897e9243cf4f3016e76a88Marc Blank /** 7929734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * This column is available for use by sync adapters. Column name. 7939734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 7949734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 7959734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String SYNC_DATA2 = "sync_data2"; 7969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 7979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 7989734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * This column is available for use by sync adapters. Column name. 7999734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 8009734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 8019734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String SYNC_DATA3 = "sync_data3"; 8029734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 8039734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 8049734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * This column is available for use by sync adapters. Column name. 8059734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 8069734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 8079734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String SYNC_DATA4 = "sync_data4"; 8089734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 8099734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 8109734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * This column is available for use by sync adapters. Column name. 8119734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 8129734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 8139734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String SYNC_DATA5 = "sync_data5"; 8149734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 8159734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 8169734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * This column is available for use by sync adapters. Column name. 8179734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 8189734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 8199734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String SYNC_DATA6 = "sync_data6"; 8209734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 8219734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 8229734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * This column is available for use by sync adapters. Column name. 823866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert * <P>Type: TEXT</P> 824866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert */ 825866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert public static final String SYNC_DATA7 = "sync_data7"; 826866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert 827866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert /** 8289734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * This column is available for use by sync adapters. Column name. 8299734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 8309734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 8319734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String SYNC_DATA8 = "sync_data8"; 8329734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 8339734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 8349734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * This column is available for use by sync adapters. Column name. 8359734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 8369734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 8379734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String SYNC_DATA9 = "sync_data9"; 8389734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 8399734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 8409734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * This column is available for use by sync adapters. Column name. 8419734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik * <P>Type: TEXT</P> 8429734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik */ 8439734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final String SYNC_DATA10 = "sync_data10"; 8449734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik 8459734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik /** 846866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert * Used to indicate that a row is not a real event but an original copy of a locally 847866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert * modified event. A copy is made when an event changes from non-dirty to dirty and the 848866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert * event is on a calendar with {@link Calendars#CAN_PARTIALLY_UPDATE} set to 1. This copy 849866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert * does not get expanded in the instances table and is only visible in queries made by a 850866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert * sync adapter. The copy gets removed when the event is changed back to non-dirty by a 851866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert * sync adapter. 852866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert * <P>Type: INTEGER (boolean)</P> 853866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert */ 854866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert public static final String LAST_SYNCED = "lastSynced"; 855866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert 856866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert /** 857c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The time the event starts in UTC millis since epoch. Column name. 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long; millis since epoch)</P> 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DTSTART = "dtstart"; 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 863c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The time the event ends in UTC millis since epoch. Column name. 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long; millis since epoch)</P> 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DTEND = "dtend"; 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 869c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The duration of the event in RFC2445 format. Column name. 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT (duration in RFC2445 format)</P> 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DURATION = "duration"; 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 875c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The timezone for the event. Column name. 876c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * <P>Type: TEXT</P> 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EVENT_TIMEZONE = "eventTimezone"; 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 881c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The timezone for the end time of the event. Column name. 882c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * <P>Type: TEXT</P> 883c07b06f12ac1f93b35f3e120a5e7d6aa5f934c6fErik */ 884651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final String EVENT_END_TIMEZONE = "eventEndTimezone"; 885c07b06f12ac1f93b35f3e120a5e7d6aa5f934c6fErik 886c07b06f12ac1f93b35f3e120a5e7d6aa5f934c6fErik /** 887c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Is the event all day (time zone independent). Column name. 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (boolean)</P> 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ALL_DAY = "allDay"; 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 893651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * Defines how the event shows up for others when the calendar is 894c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * shared. Column name. 895c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * <P>Type: INTEGER (One of {@link #ACCESS_DEFAULT}, ...)</P> 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 897651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final String ACCESS_LEVEL = "accessLevel"; 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik /** 900651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * Default access is controlled by the server and will be treated as 901651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * public on the device. 902651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik */ 903651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final int ACCESS_DEFAULT = 0; 904651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik /** 905651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * Confidential is not used by the app. 906651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik */ 907651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final int ACCESS_CONFIDENTIAL = 1; 908651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik /** 909c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Private shares the event as a free/busy slot with no details. 910651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik */ 911651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final int ACCESS_PRIVATE = 2; 912651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik /** 913c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Public makes the contents visible to anyone with access to the 914651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * calendar. 915651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik */ 916651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final int ACCESS_PUBLIC = 3; 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 919651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * If this event counts as busy time or is still free time that can be 920c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * scheduled over. Column name. 921c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * <P>Type: INTEGER (One of {@link #AVAILABILITY_BUSY}, 922c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * {@link #AVAILABILITY_FREE})</P> 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 924651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final String AVAILABILITY = "availability"; 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 926651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik /** 927651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * Indicates that this event takes up time and will conflict with other 928651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * events. 929651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik */ 930651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final int AVAILABILITY_BUSY = 0; 931651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik /** 932651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * Indicates that this event is free time and will not conflict with 933651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * other events. 934651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik */ 935651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final int AVAILABILITY_FREE = 1; 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 938c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Whether the event has an alarm or not. Column name. 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (boolean)</P> 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String HAS_ALARM = "hasAlarm"; 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 944c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Whether the event has extended properties or not. Column name. 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (boolean)</P> 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String HAS_EXTENDED_PROPERTIES = "hasExtendedProperties"; 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 950c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The recurrence rule for the event. Column name. 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String RRULE = "rrule"; 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 956c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The recurrence dates for the event. Column name. 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String RDATE = "rdate"; 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 962c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The recurrence exception rule for the event. Column name. 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXRULE = "exrule"; 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 968c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The recurrence exception dates for the event. Column name. 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXDATE = "exdate"; 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 974c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The {@link Events#_ID} of the original recurring event for which this 975c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * event is an exception. Column name. 976c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik * <P>Type: TEXT</P> 977c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik */ 978c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik public static final String ORIGINAL_ID = "original_id"; 979c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik 980c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik /** 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The _sync_id of the original recurring event for which this event is 982c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik * an exception. The provider should keep the original_id in sync when 983c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * this is updated. Column name. 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 986651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final String ORIGINAL_SYNC_ID = "original_sync_id"; 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The original instance time of the recurring event for which this 990c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * event is an exception. Column name. 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long; millis since epoch)</P> 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ORIGINAL_INSTANCE_TIME = "originalInstanceTime"; 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The allDay status (true or false) of the original recurring event 997c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * for which this event is an exception. Column name. 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (boolean)</P> 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ORIGINAL_ALL_DAY = "originalAllDay"; 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1003c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The last date this event repeats on, or NULL if it never ends. Column 1004c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * name. 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long; millis since epoch)</P> 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String LAST_DATE = "lastDate"; 100879f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff 100979f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff /** 101079f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff * Whether the event has attendee information. True if the event 101179f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff * has full attendee data, false if the event has information about 1012c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * self only. Column name. 101379f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff * <P>Type: INTEGER (boolean)</P> 101479f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff */ 101579f0c56b63bd73585cebf6930c3783c140c6e465Ken Shirriff public static final String HAS_ATTENDEE_DATA = "hasAttendeeData"; 10163d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff 10173d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff /** 1018c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Whether guests can modify the event. Column name. 10193d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff * <P>Type: INTEGER (boolean)</P> 10203d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff */ 10213d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff public static final String GUESTS_CAN_MODIFY = "guestsCanModify"; 10223d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff 10233d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff /** 1024c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Whether guests can invite other guests. Column name. 10253d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff * <P>Type: INTEGER (boolean)</P> 10263d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff */ 10273d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff public static final String GUESTS_CAN_INVITE_OTHERS = "guestsCanInviteOthers"; 10283d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff 10293d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff /** 1030c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Whether guests can see the list of attendees. Column name. 10313d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff * <P>Type: INTEGER (boolean)</P> 10323d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff */ 10333d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff public static final String GUESTS_CAN_SEE_GUESTS = "guestsCanSeeGuests"; 10343d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff 10353d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff /** 1036c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Email of the organizer (owner) of the event. Column name. 10373d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff * <P>Type: STRING</P> 10383d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff */ 10393d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff public static final String ORGANIZER = "organizer"; 10403d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff 10413d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff /** 1042c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Whether the user can invite others to the event. The 1043c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * GUESTS_CAN_INVITE_OTHERS is a setting that applies to an arbitrary 1044c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * guest, while CAN_INVITE_OTHERS indicates if the user can invite 1045c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * others (either through GUESTS_CAN_INVITE_OTHERS or because the user 1046c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * has modify access to the event). Column name. 10473d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff * <P>Type: INTEGER (boolean, readonly)</P> 10483d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff */ 10493d037078b8313afb003e32d15a47a3b57af776cbKen Shirriff public static final String CAN_INVITE_OTHERS = "canInviteOthers"; 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1053c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Class that represents an Event Entity. There is one entry per event. 1054c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Recurring events show up as a single entry. This is a helper class to 1055c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * make batch operations easier. A {@link ContentResolver} or 1056c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * {@link ContentProviderClient} is required as the helper does additional 1057c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * queries to add reminders and attendees to each entry. 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1059651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final class EventsEntity implements BaseColumns, SyncColumns, EventsColumns { 1060328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana /** 1061328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana * The content:// style URL for this table 1062328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana */ 1063a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + 1064a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff "/event_entities"); 1065328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 1066c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1067c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Creates a new iterator for events 1068c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 1069c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param cursor An event query 1070c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param resolver For performing additional queries 1071c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @return an EntityIterator containing one entity per event in the 1072c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * cursor 1073c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 1074328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana public static EntityIterator newEntityIterator(Cursor cursor, ContentResolver resolver) { 1075328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana return new EntityIteratorImpl(cursor, resolver); 1076328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1077328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 1078c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1079c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Creates a new iterator for events 1080c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 1081c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param cursor An event query 1082c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param provider For performing additional queries 1083c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @return an EntityIterator containing one entity per event in the 1084c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * cursor 1085c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 1086328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana public static EntityIterator newEntityIterator(Cursor cursor, 1087328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana ContentProviderClient provider) { 1088328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana return new EntityIteratorImpl(cursor, provider); 1089328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1090328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 1091328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private static class EntityIteratorImpl extends CursorEntityIterator { 1092328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private final ContentResolver mResolver; 1093328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private final ContentProviderClient mProvider; 1094328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 1095328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private static final String[] REMINDERS_PROJECTION = new String[] { 1096328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana Reminders.MINUTES, 1097328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana Reminders.METHOD, 1098328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana }; 1099328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private static final int COLUMN_MINUTES = 0; 1100328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private static final int COLUMN_METHOD = 1; 1101328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 1102328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private static final String[] ATTENDEES_PROJECTION = new String[] { 1103328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana Attendees.ATTENDEE_NAME, 1104328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana Attendees.ATTENDEE_EMAIL, 1105328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana Attendees.ATTENDEE_RELATIONSHIP, 1106328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana Attendees.ATTENDEE_TYPE, 1107328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana Attendees.ATTENDEE_STATUS, 1108328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana }; 1109328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private static final int COLUMN_ATTENDEE_NAME = 0; 1110328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private static final int COLUMN_ATTENDEE_EMAIL = 1; 1111328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private static final int COLUMN_ATTENDEE_RELATIONSHIP = 2; 1112328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private static final int COLUMN_ATTENDEE_TYPE = 3; 1113328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private static final int COLUMN_ATTENDEE_STATUS = 4; 1114328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana private static final String[] EXTENDED_PROJECTION = new String[] { 11158f643c1040d45f03584b0382c7c5d933388b9103Marc Blank ExtendedProperties._ID, 1116328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana ExtendedProperties.NAME, 11178f643c1040d45f03584b0382c7c5d933388b9103Marc Blank ExtendedProperties.VALUE 1118328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana }; 11198f643c1040d45f03584b0382c7c5d933388b9103Marc Blank private static final int COLUMN_ID = 0; 11208f643c1040d45f03584b0382c7c5d933388b9103Marc Blank private static final int COLUMN_NAME = 1; 11218f643c1040d45f03584b0382c7c5d933388b9103Marc Blank private static final int COLUMN_VALUE = 2; 1122328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 11231dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio private static final String WHERE_EVENT_ID = "event_id=?"; 11241dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio 1125328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana public EntityIteratorImpl(Cursor cursor, ContentResolver resolver) { 1126328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana super(cursor); 1127328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana mResolver = resolver; 1128328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana mProvider = null; 1129328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1130328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 1131328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana public EntityIteratorImpl(Cursor cursor, ContentProviderClient provider) { 1132328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana super(cursor); 1133328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana mResolver = null; 1134328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana mProvider = provider; 1135328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1136328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 113764a556d755d27b1182897e9243cf4f3016e76a88Marc Blank @Override 1138328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana public Entity getEntityAndIncrementCursor(Cursor cursor) throws RemoteException { 1139328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana // we expect the cursor is already at the row we need to read from 1140328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana final long eventId = cursor.getLong(cursor.getColumnIndexOrThrow(Events._ID)); 1141328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana ContentValues cv = new ContentValues(); 1142328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana cv.put(Events._ID, eventId); 1143328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, CALENDAR_ID); 1144328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, TITLE); 1145328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, DESCRIPTION); 1146328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_LOCATION); 1147328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, STATUS); 1148328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, SELF_ATTENDEE_STATUS); 1149328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DTSTART); 1150328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DTEND); 1151328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, DURATION); 1152328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_TIMEZONE); 1153c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EVENT_END_TIMEZONE); 1154328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ALL_DAY); 1155651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, ACCESS_LEVEL); 1156651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, AVAILABILITY); 1157328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, HAS_ALARM); 1158328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, 1159328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana HAS_EXTENDED_PROPERTIES); 1160328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, RRULE); 1161328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, RDATE); 1162328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EXRULE); 1163328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, EXDATE); 1164651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORIGINAL_SYNC_ID); 1165c0bd9bcdd9fa2de9a11c09418208702d0791555aRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORIGINAL_ID); 1166328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, 1167328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana ORIGINAL_INSTANCE_TIME); 1168328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, ORIGINAL_ALL_DAY); 1169328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, LAST_DATE); 1170328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, HAS_ATTENDEE_DATA); 1171328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, 1172328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana GUESTS_CAN_INVITE_OTHERS); 1173328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, GUESTS_CAN_MODIFY); 1174328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, GUESTS_CAN_SEE_GUESTS); 1175328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORGANIZER); 1176328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_ID); 1177651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, DIRTY); 1178866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, LAST_SYNCED); 1179c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, DELETED); 11809734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA1); 11819734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA2); 11829734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA3); 11839734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA4); 11849734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA5); 11859734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA6); 11869734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA7); 11879734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA8); 11889734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA9); 11899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, SYNC_DATA10); 1190be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC1); 1191be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC2); 1192be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC3); 1193be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC4); 1194be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC5); 1195be01039a7f5c4de42cb91d184d37ef8db1f83b79RoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC6); 11969734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC7); 11979734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC8); 11989734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC9); 11999734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, CAL_SYNC10); 1200328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 1201328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana Entity entity = new Entity(cv); 1202328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana Cursor subCursor; 1203328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana if (mResolver != null) { 1204328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor = mResolver.query(Reminders.CONTENT_URI, REMINDERS_PROJECTION, 12051dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio WHERE_EVENT_ID, 12061dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio new String[] { Long.toString(eventId) } /* selectionArgs */, 12071dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio null /* sortOrder */); 1208328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } else { 1209328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor = mProvider.query(Reminders.CONTENT_URI, REMINDERS_PROJECTION, 12101dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio WHERE_EVENT_ID, 12111dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio new String[] { Long.toString(eventId) } /* selectionArgs */, 12121dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio null /* sortOrder */); 1213328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1214328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana try { 1215328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana while (subCursor.moveToNext()) { 1216328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana ContentValues reminderValues = new ContentValues(); 1217328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana reminderValues.put(Reminders.MINUTES, subCursor.getInt(COLUMN_MINUTES)); 1218328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana reminderValues.put(Reminders.METHOD, subCursor.getInt(COLUMN_METHOD)); 1219328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana entity.addSubValue(Reminders.CONTENT_URI, reminderValues); 1220328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1221328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } finally { 1222328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor.close(); 1223328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1224328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 1225328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana if (mResolver != null) { 1226328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor = mResolver.query(Attendees.CONTENT_URI, ATTENDEES_PROJECTION, 12271dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio WHERE_EVENT_ID, 12281dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio new String[] { Long.toString(eventId) } /* selectionArgs */, 12291dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio null /* sortOrder */); 1230328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } else { 1231328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor = mProvider.query(Attendees.CONTENT_URI, ATTENDEES_PROJECTION, 12321dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio WHERE_EVENT_ID, 12331dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio new String[] { Long.toString(eventId) } /* selectionArgs */, 12341dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio null /* sortOrder */); 1235328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1236328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana try { 1237328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana while (subCursor.moveToNext()) { 1238328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana ContentValues attendeeValues = new ContentValues(); 1239328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana attendeeValues.put(Attendees.ATTENDEE_NAME, 1240328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor.getString(COLUMN_ATTENDEE_NAME)); 1241328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana attendeeValues.put(Attendees.ATTENDEE_EMAIL, 1242328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor.getString(COLUMN_ATTENDEE_EMAIL)); 1243328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana attendeeValues.put(Attendees.ATTENDEE_RELATIONSHIP, 1244328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor.getInt(COLUMN_ATTENDEE_RELATIONSHIP)); 1245328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana attendeeValues.put(Attendees.ATTENDEE_TYPE, 1246328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor.getInt(COLUMN_ATTENDEE_TYPE)); 1247328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana attendeeValues.put(Attendees.ATTENDEE_STATUS, 1248328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor.getInt(COLUMN_ATTENDEE_STATUS)); 1249328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana entity.addSubValue(Attendees.CONTENT_URI, attendeeValues); 1250328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1251328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } finally { 1252328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor.close(); 1253328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1254328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 1255328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana if (mResolver != null) { 1256328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor = mResolver.query(ExtendedProperties.CONTENT_URI, EXTENDED_PROJECTION, 12571dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio WHERE_EVENT_ID, 12581dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio new String[] { Long.toString(eventId) } /* selectionArgs */, 12591dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio null /* sortOrder */); 1260328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } else { 1261328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor = mProvider.query(ExtendedProperties.CONTENT_URI, EXTENDED_PROJECTION, 12621dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio WHERE_EVENT_ID, 12631dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio new String[] { Long.toString(eventId) } /* selectionArgs */, 12641dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio null /* sortOrder */); 1265328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1266328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana try { 1267328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana while (subCursor.moveToNext()) { 1268328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana ContentValues extendedValues = new ContentValues(); 12698f643c1040d45f03584b0382c7c5d933388b9103Marc Blank extendedValues.put(ExtendedProperties._ID, 12708f643c1040d45f03584b0382c7c5d933388b9103Marc Blank subCursor.getString(COLUMN_ID)); 12713b16892c6bc6b804133163db24ffc5ff54b9a8fbKen Shirriff extendedValues.put(ExtendedProperties.NAME, 12723b16892c6bc6b804133163db24ffc5ff54b9a8fbKen Shirriff subCursor.getString(COLUMN_NAME)); 1273328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana extendedValues.put(ExtendedProperties.VALUE, 12743b16892c6bc6b804133163db24ffc5ff54b9a8fbKen Shirriff subCursor.getString(COLUMN_VALUE)); 1275328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana entity.addSubValue(ExtendedProperties.CONTENT_URI, extendedValues); 1276328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1277328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } finally { 1278328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana subCursor.close(); 1279328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1280328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 1281328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana cursor.moveToNext(); 1282328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana return entity; 1283328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1284328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1285328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana } 1286328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana 1287328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana /** 1288f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * Constants and helpers for the Events table, which contains details for 1289f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * individual events. <h3>Operations</h3> All operations can be done either 1290f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * as an app or as a sync adapter. To perform an operation as a sync adapter 1291f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * {@link #CALLER_IS_SYNCADAPTER} should be set to true and 1292f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * {@link #ACCOUNT_NAME} and {@link #ACCOUNT_TYPE} must be set in the Uri 1293f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * parameters. See 1294f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * {@link Uri.Builder#appendQueryParameter(java.lang.String, java.lang.String)} 1295f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * for details on adding parameters. Sync adapters have write access to more 1296f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * columns but are restricted to a single account at a time. 1297fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <dl> 1298fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <dt><b>Insert</b></dt> 1299fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <dd>When inserting a new event the following fields must be included: 1300fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <ul> 1301fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>dtstart</li> 1302fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>dtend -or- a (rrule or rdate) and a duration</li> 1303fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>a calendar_id</li> 1304fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * </ul> 1305fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * There are also further requirements when inserting or updating an event. 1306fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * See the section on Writing to Events.</dd> 1307fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <dt><b>Update</b></dt> 1308f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * <dd>To perform an update of an Event the {@link Events#_ID} of the event 1309f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * should be provided either as an appended id to the Uri ( 1310fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * {@link ContentUris#withAppendedId}) or as the first selection item--the 1311fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * selection should start with "_id=?" and the first selectionArg should be 1312f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * the _id of the event. Updates may also be done using a selection and no 1313f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * id. Updating an event must respect the same rules as inserting and is 1314f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * further restricted in the fields that can be written. See the section on 1315f4010c5768514c41dc671ec67157ba24880b4c6fRoboErik * Writing to Events.</dd> 1316fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <dt><b>Delete</b></dt> 1317fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <dd>Events can be deleted either by the {@link Events#_ID} as an appended 1318fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * id on the Uri or using any standard selection. If an appended id is used 1319fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * a selection is not allowed. There are two versions of delete: as an app 1320fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * and as a sync adapter. An app delete will set the deleted column on an 1321fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * event and remove all instances of that event. A sync adapter delete will 1322fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * remove the event from the database and all associated data.</dd> 1323fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <dt><b>Query</b></dt> 1324fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <dd>Querying the Events table will get you all information about a set of 1325fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * events except their reminders, attendees, and extended properties. There 1326fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * will be one row returned for each event that matches the query selection, 1327fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * or at most a single row if the {@link Events#_ID} is appended to the Uri. 1328fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * Recurring events will only return a single row regardless of the number 1329fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * of times that event repeats.</dd> 1330fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * </dl> 1331fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <h3>Writing to Events</h3> There are further restrictions on all Updates 1332fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * and Inserts in the Events table: 1333fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <ul> 1334fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>If allDay is set to 1 eventTimezone must be {@link Time#TIMEZONE_UTC} 1335fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * and the time must correspond to a midnight boundary.</li> 1336fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>Exceptions are not allowed to recur. If rrule or rdate is not empty, 1337fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * original_id and original_sync_id must be empty.</li> 1338fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>In general a calendar_id should not be modified after insertion. This 1339fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * is not explicitly forbidden but many sync adapters will not behave in an 1340fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * expected way if the calendar_id is modified.</li> 1341fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * </ul> 1342fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * The following Events columns are writable by both an app and a sync 1343fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * adapter. 1344fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <ul> 1345fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #CALENDAR_ID}</li> 1346fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #ORGANIZER}</li> 1347fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #TITLE}</li> 1348fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #EVENT_LOCATION}</li> 1349fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #DESCRIPTION}</li> 1350fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #EVENT_COLOR}</li> 1351fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #DTSTART}</li> 1352fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #DTEND}</li> 1353fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #EVENT_TIMEZONE}</li> 1354fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #EVENT_END_TIMEZONE}</li> 1355fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #DURATION}</li> 1356fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #ALL_DAY}</li> 1357fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #RRULE}</li> 1358fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #RDATE}</li> 1359fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #EXRULE}</li> 1360fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #EXDATE}</li> 1361fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #ORIGINAL_ID}</li> 1362fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #ORIGINAL_SYNC_ID}</li> 1363fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #ORIGINAL_INSTANCE_TIME}</li> 1364fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #ORIGINAL_ALL_DAY}</li> 1365fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #ACCESS_LEVEL}</li> 1366fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #AVAILABILITY}</li> 1367fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #GUESTS_CAN_MODIFY}</li> 1368fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #GUESTS_CAN_INVITE_OTHERS}</li> 1369fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #GUESTS_CAN_SEE_GUESTS}</li> 1370fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * </ul> 1371fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * The following Events columns are writable only by a sync adapter 1372fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <ul> 1373fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #DIRTY}</li> 1374fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #_SYNC_ID}</li> 1375fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #SYNC_DATA1}</li> 1376fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #SYNC_DATA2}</li> 1377fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #SYNC_DATA3}</li> 1378fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #SYNC_DATA4}</li> 1379fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #SYNC_DATA5}</li> 1380fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #SYNC_DATA6}</li> 1381fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #SYNC_DATA7}</li> 1382fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #SYNC_DATA8}</li> 1383fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #SYNC_DATA9}</li> 1384fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * <li>{@link #SYNC_DATA10}</li> 1385fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * </ul> 1386fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * The remaining columns are either updated by the provider only or are 1387fe37b49dd416e8b6b6148290bea6b3a38a3c5661RoboErik * views into other tables and cannot be changed through the Events table. 1388328c0e7986aa6bb7752ec6de3da9c999920bb55fFred Quintana */ 13899734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik public static final class Events implements BaseColumns, SyncColumns, EventsColumns, 1390e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik CalendarColumns { 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1392c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1393c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The content:// style URL for interacting with events. Appending an 1394c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * event id using {@link ContentUris#withAppendedId(Uri, long)} will 1395c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * specify a single event. 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1397c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik @SuppressWarnings("hiding") 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri CONTENT_URI = 1399a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff Uri.parse("content://" + AUTHORITY + "/events"); 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14024a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden * The content:// style URI for recurring event exceptions. Insertions require an 14034a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden * appended event ID. Deletion of exceptions requires both the original event ID and 14044a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden * the exception event ID (see {@link Uri.Builder#appendPath}). 14054a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden */ 1406083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik public static final Uri CONTENT_EXCEPTION_URI = 14074a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden Uri.parse("content://" + AUTHORITY + "/exception"); 14084a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden 14094a8c478dfadbc86938576f72c25799893cb3b92cAndy McFadden /** 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1412c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik private static final String DEFAULT_SORT_ORDER = ""; 1413651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik 1414651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik /** 1415651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * These are columns that should only ever be updated by the provider, 1416651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * either because they are views mapped to another table or because they 1417083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * are used for provider only functionality. TODO move to provider 1418083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * 1419083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * @hide 1420651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik */ 1421651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static String[] PROVIDER_WRITABLE_COLUMNS = new String[] { 1422651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik ACCOUNT_NAME, 1423c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik ACCOUNT_TYPE, 1424c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik CAL_SYNC1, 1425c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik CAL_SYNC2, 1426c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik CAL_SYNC3, 1427c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik CAL_SYNC4, 1428c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik CAL_SYNC5, 1429866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert CAL_SYNC6, 14309734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CAL_SYNC7, 14319734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CAL_SYNC8, 14329734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CAL_SYNC9, 14339734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CAL_SYNC10, 14349734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik ALLOWED_REMINDERS, 14359734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CALENDAR_ACCESS_LEVEL, 14369734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CALENDAR_COLOR, 14379734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CALENDAR_TIME_ZONE, 14389734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CAN_MODIFY_TIME_ZONE, 14399734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CAN_ORGANIZER_RESPOND, 14409734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik CALENDAR_DISPLAY_NAME, 1441866f40aeda0b771bfac28bbf51959b128538c4acAlon Albert CAN_PARTIALLY_UPDATE, 14429734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik SYNC_EVENTS, 14439734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik VISIBLE, 1444651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik }; 1445651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik 1446651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik /** 1447651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * These fields are only writable by a sync adapter. To modify them the 1448651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik * caller must include CALLER_IS_SYNCADAPTER, _SYNC_ACCOUNT, and 1449083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * _SYNC_ACCOUNT_TYPE in the query parameters. TODO move to provider. 1450083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * 1451083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * @hide 1452651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik */ 1453651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik public static final String[] SYNC_WRITABLE_COLUMNS = new String[] { 1454651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik _SYNC_ID, 1455651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik DIRTY, 14569734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik SYNC_DATA1, 14579734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik SYNC_DATA2, 14589734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik SYNC_DATA3, 14599734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik SYNC_DATA4, 14609734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik SYNC_DATA5, 14619734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik SYNC_DATA6, 14629734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik SYNC_DATA7, 14639734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik SYNC_DATA8, 14649734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik SYNC_DATA9, 14659734df5f0cc8a1256f64b464c4cc884def00b1fbRoboErik SYNC_DATA10, 1466651c02e61fb6f1776fb2688c6f740df0d5b7f4bbRoboErik }; 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1470c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Fields and helpers for interacting with Instances. An instance is a 1471c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * single occurrence of an event including time zone specific start and end 14723771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * days and minutes. The instances table is not writable and only provides a 14733771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * way to query event occurrences. 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1475e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik public static final class Instances implements BaseColumns, EventsColumns, CalendarColumns { 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1477e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik private static final String WHERE_CALENDARS_SELECTED = Calendars.VISIBLE + "=?"; 1478e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik private static final String[] WHERE_CALENDARS_ARGS = { 1479e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik "1" 1480e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik }; 14811dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio 1482c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1483c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Performs a query to return all visible instances in the given range. 1484c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * This is a blocking function and should not be done on the UI thread. 1485c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * This will cause an expansion of recurring events to fill this time 1486c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * range if they are not already expanded and will slow down for larger 1487c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * time ranges with many recurring events. 1488c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 1489c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param cr The ContentResolver to use for the query 1490c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param projection The columns to return 1491c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param begin The start of the time range to query in UTC millis since 1492c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * epoch 1493c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param end The end of the time range to query in UTC millis since 1494c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * epoch 1495c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @return A Cursor containing all instances in the given range 1496c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Cursor query(ContentResolver cr, String[] projection, 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long begin, long end) { 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.Builder builder = CONTENT_URI.buildUpon(); 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentUris.appendId(builder, begin); 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentUris.appendId(builder, end); 15021dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio return cr.query(builder.build(), projection, WHERE_CALENDARS_SELECTED, 1503e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik WHERE_CALENDARS_ARGS, DEFAULT_SORT_ORDER); 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1506c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1507c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Performs a query to return all visible instances in the given range 1508c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * that match the given query. This is a blocking function and should 1509c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * not be done on the UI thread. This will cause an expansion of 1510c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * recurring events to fill this time range if they are not already 1511c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * expanded and will slow down for larger time ranges with many 1512c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * recurring events. 1513c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 1514c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param cr The ContentResolver to use for the query 1515c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param projection The columns to return 1516c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param begin The start of the time range to query in UTC millis since 1517c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * epoch 1518c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param end The end of the time range to query in UTC millis since 1519c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * epoch 1520c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param searchQuery A string of space separated search terms. Segments 1521c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * enclosed by double quotes will be treated as a single 1522c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * term. 1523c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @return A Cursor of instances matching the search terms in the given 1524c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * time range 1525c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Cursor query(ContentResolver cr, String[] projection, 152719f845804c4b8f295669bbe7338d91d42451a0fdMason Tang long begin, long end, String searchQuery) { 152819f845804c4b8f295669bbe7338d91d42451a0fdMason Tang Uri.Builder builder = CONTENT_SEARCH_URI.buildUpon(); 152919f845804c4b8f295669bbe7338d91d42451a0fdMason Tang ContentUris.appendId(builder, begin); 153019f845804c4b8f295669bbe7338d91d42451a0fdMason Tang ContentUris.appendId(builder, end); 1531c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik builder = builder.appendPath(searchQuery); 1532e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik return cr.query(builder.build(), projection, WHERE_CALENDARS_SELECTED, 1533e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik WHERE_CALENDARS_ARGS, DEFAULT_SORT_ORDER); 153419f845804c4b8f295669bbe7338d91d42451a0fdMason Tang } 153519f845804c4b8f295669bbe7338d91d42451a0fdMason Tang 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1537c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The content:// style URL for querying an instance range. The begin 1538c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * and end of the range to query should be added as path segments if 1539c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * this is used directly. 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1541c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik @SuppressWarnings("hiding") 1542a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + 1543a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff "/instances/when"); 1544c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1545c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The content:// style URL for querying an instance range by Julian 1546c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Day. The start and end day should be added as path segments if this 1547c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * is used directly. 1548c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 15492cfb0d166b5e8a0e89b2b3d19abe4f76ff38cfabMichael Chan public static final Uri CONTENT_BY_DAY_URI = 1550a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff Uri.parse("content://" + AUTHORITY + "/instances/whenbyday"); 1551c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1552c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The content:// style URL for querying an instance range with a search 1553c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * term. The begin, end, and search string should be appended as path 1554c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * segments if this is used directly. 1555c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 155619f845804c4b8f295669bbe7338d91d42451a0fdMason Tang public static final Uri CONTENT_SEARCH_URI = Uri.parse("content://" + AUTHORITY + 155719f845804c4b8f295669bbe7338d91d42451a0fdMason Tang "/instances/search"); 1558c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1559c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The content:// style URL for querying an instance range with a search 1560c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * term. The start day, end day, and search string should be appended as 1561c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * path segments if this is used directly. 1562c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 156319f845804c4b8f295669bbe7338d91d42451a0fdMason Tang public static final Uri CONTENT_SEARCH_BY_DAY_URI = 156419f845804c4b8f295669bbe7338d91d42451a0fdMason Tang Uri.parse("content://" + AUTHORITY + "/instances/searchbyday"); 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table. 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1569c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik private static final String DEFAULT_SORT_ORDER = "begin ASC"; 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1572c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The beginning time of the instance, in UTC milliseconds. Column name. 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long; millis since epoch)</P> 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String BEGIN = "begin"; 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1578c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The ending time of the instance, in UTC milliseconds. Column name. 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long; millis since epoch)</P> 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String END = "end"; 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1584c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The _id of the event for this instance. Column name. 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long, foreign key to the Events table)</P> 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EVENT_ID = "event_id"; 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1590c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The Julian start day of the instance, relative to the local time 1591c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * zone. Column name. 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (int)</P> 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String START_DAY = "startDay"; 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1597c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The Julian end day of the instance, relative to the local time 1598c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * zone. Column name. 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (int)</P> 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String END_DAY = "endDay"; 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The start minute of the instance measured from midnight in the 1605c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * local time zone. Column name. 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (int)</P> 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String START_MINUTE = "startMinute"; 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The end minute of the instance measured from midnight in the 1612c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * local time zone. Column name. 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (int)</P> 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String END_MINUTE = "endMinute"; 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1618b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik protected interface CalendarCacheColumns { 161971ad58c751eb12a500916556c41e704a93895801Erik /** 1620c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The key for the setting. Keys are defined in {@link CalendarCache}. 162171ad58c751eb12a500916556c41e704a93895801Erik */ 162271ad58c751eb12a500916556c41e704a93895801Erik public static final String KEY = "key"; 162371ad58c751eb12a500916556c41e704a93895801Erik 162471ad58c751eb12a500916556c41e704a93895801Erik /** 162571ad58c751eb12a500916556c41e704a93895801Erik * The value of the given setting. 162671ad58c751eb12a500916556c41e704a93895801Erik */ 162771ad58c751eb12a500916556c41e704a93895801Erik public static final String VALUE = "value"; 162871ad58c751eb12a500916556c41e704a93895801Erik } 162971ad58c751eb12a500916556c41e704a93895801Erik 1630083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik /** 1631083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * CalendarCache stores some settings for calendar including the current 1632083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * time zone for the instances. These settings are stored using a key/value 1633083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * scheme. A {@link #KEY} must be specified when updating these values. 1634083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik */ 163571ad58c751eb12a500916556c41e704a93895801Erik public static class CalendarCache implements CalendarCacheColumns { 163671ad58c751eb12a500916556c41e704a93895801Erik /** 163771ad58c751eb12a500916556c41e704a93895801Erik * The URI to use for retrieving the properties from the Calendar db. 163871ad58c751eb12a500916556c41e704a93895801Erik */ 163971ad58c751eb12a500916556c41e704a93895801Erik public static final Uri URI = 164071ad58c751eb12a500916556c41e704a93895801Erik Uri.parse("content://" + AUTHORITY + "/properties"); 164171ad58c751eb12a500916556c41e704a93895801Erik 164271ad58c751eb12a500916556c41e704a93895801Erik /** 164371ad58c751eb12a500916556c41e704a93895801Erik * They key for updating the use of auto/home time zones in Calendar. 164471ad58c751eb12a500916556c41e704a93895801Erik * Valid values are {@link #TIMEZONE_TYPE_AUTO} or 164571ad58c751eb12a500916556c41e704a93895801Erik * {@link #TIMEZONE_TYPE_HOME}. 164671ad58c751eb12a500916556c41e704a93895801Erik */ 1647083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik public static final String KEY_TIMEZONE_TYPE = "timezoneType"; 164871ad58c751eb12a500916556c41e704a93895801Erik 164971ad58c751eb12a500916556c41e704a93895801Erik /** 165071ad58c751eb12a500916556c41e704a93895801Erik * The key for updating the time zone used by the provider when it 165171ad58c751eb12a500916556c41e704a93895801Erik * generates the instances table. This should only be written if the 165271ad58c751eb12a500916556c41e704a93895801Erik * type is set to {@link #TIMEZONE_TYPE_HOME}. A valid time zone id 165371ad58c751eb12a500916556c41e704a93895801Erik * should be written to this field. 165471ad58c751eb12a500916556c41e704a93895801Erik */ 1655083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik public static final String KEY_TIMEZONE_INSTANCES = "timezoneInstances"; 165671ad58c751eb12a500916556c41e704a93895801Erik 165771ad58c751eb12a500916556c41e704a93895801Erik /** 165871ad58c751eb12a500916556c41e704a93895801Erik * The key for reading the last time zone set by the user. This should 165971ad58c751eb12a500916556c41e704a93895801Erik * only be read by apps and it will be automatically updated whenever 1660083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * {@link #KEY_TIMEZONE_INSTANCES} is updated with 166171ad58c751eb12a500916556c41e704a93895801Erik * {@link #TIMEZONE_TYPE_HOME} set. 166271ad58c751eb12a500916556c41e704a93895801Erik */ 1663083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik public static final String KEY_TIMEZONE_INSTANCES_PREVIOUS = "timezoneInstancesPrevious"; 166471ad58c751eb12a500916556c41e704a93895801Erik 166571ad58c751eb12a500916556c41e704a93895801Erik /** 1666083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * The value to write to {@link #KEY_TIMEZONE_TYPE} if the provider 166771ad58c751eb12a500916556c41e704a93895801Erik * should stay in sync with the device's time zone. 166871ad58c751eb12a500916556c41e704a93895801Erik */ 166971ad58c751eb12a500916556c41e704a93895801Erik public static final String TIMEZONE_TYPE_AUTO = "auto"; 167071ad58c751eb12a500916556c41e704a93895801Erik 167171ad58c751eb12a500916556c41e704a93895801Erik /** 1672083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * The value to write to {@link #KEY_TIMEZONE_TYPE} if the provider 167371ad58c751eb12a500916556c41e704a93895801Erik * should use a fixed time zone set by the user. 167471ad58c751eb12a500916556c41e704a93895801Erik */ 167571ad58c751eb12a500916556c41e704a93895801Erik public static final String TIMEZONE_TYPE_HOME = "home"; 167671ad58c751eb12a500916556c41e704a93895801Erik } 167771ad58c751eb12a500916556c41e704a93895801Erik 167871ad58c751eb12a500916556c41e704a93895801Erik /** 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A few Calendar globals are needed in the CalendarProvider for expanding 168059dab49cb8350afd1baa77999ec2f91283d78536RoboErik * the Instances table and these are all stored in the first (and only) row 168159dab49cb8350afd1baa77999ec2f91283d78536RoboErik * of the CalendarMetaData table. 168259dab49cb8350afd1baa77999ec2f91283d78536RoboErik * 168359dab49cb8350afd1baa77999ec2f91283d78536RoboErik * @hide 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1685b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik protected interface CalendarMetaDataColumns { 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The local timezone that was used for precomputing the fields 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the Instances table. 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String LOCAL_TIMEZONE = "localTimezone"; 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The minimum time used in expanding the Instances table, 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in UTC milliseconds. 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String MIN_INSTANCE = "minInstance"; 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The maximum time used in expanding the Instances table, 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in UTC milliseconds. 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String MAX_INSTANCE = "maxInstance"; 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17073763464e8f0df4d387ff46803e5a9c76045c85e6Erik * The minimum Julian day in the EventDays table. 17083763464e8f0df4d387ff46803e5a9c76045c85e6Erik * <P>Type: INTEGER</P> 17093763464e8f0df4d387ff46803e5a9c76045c85e6Erik */ 17103763464e8f0df4d387ff46803e5a9c76045c85e6Erik public static final String MIN_EVENTDAYS = "minEventDays"; 17113763464e8f0df4d387ff46803e5a9c76045c85e6Erik 17123763464e8f0df4d387ff46803e5a9c76045c85e6Erik /** 17133763464e8f0df4d387ff46803e5a9c76045c85e6Erik * The maximum Julian day in the EventDays table. 17143763464e8f0df4d387ff46803e5a9c76045c85e6Erik * <P>Type: INTEGER</P> 17153763464e8f0df4d387ff46803e5a9c76045c85e6Erik */ 17163763464e8f0df4d387ff46803e5a9c76045c85e6Erik public static final String MAX_EVENTDAYS = "maxEventDays"; 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17185b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff 1719c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1720c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @hide 1721c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 1722505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio public static final class CalendarMetaData implements CalendarMetaDataColumns, BaseColumns { 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17243763464e8f0df4d387ff46803e5a9c76045c85e6Erik 1725b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik protected interface EventDaysColumns { 17263763464e8f0df4d387ff46803e5a9c76045c85e6Erik /** 1727c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The Julian starting day number. Column name. 17283763464e8f0df4d387ff46803e5a9c76045c85e6Erik * <P>Type: INTEGER (int)</P> 17293763464e8f0df4d387ff46803e5a9c76045c85e6Erik */ 17303763464e8f0df4d387ff46803e5a9c76045c85e6Erik public static final String STARTDAY = "startDay"; 1731c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1732c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The Julian ending day number. Column name. 1733c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * <P>Type: INTEGER (int)</P> 1734c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 1735bd8e2e20a9a1d98f1521ec1f98b6403e73b275d3Erik public static final String ENDDAY = "endDay"; 17363763464e8f0df4d387ff46803e5a9c76045c85e6Erik 17373763464e8f0df4d387ff46803e5a9c76045c85e6Erik } 17383763464e8f0df4d387ff46803e5a9c76045c85e6Erik 1739c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1740c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Fields and helpers for querying for a list of days that contain events. 1741c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 17423763464e8f0df4d387ff46803e5a9c76045c85e6Erik public static final class EventDays implements EventDaysColumns { 1743b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY 1744c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik + "/instances/groupbyday"); 1745c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik private static final String SELECTION = "selected=1"; 17463763464e8f0df4d387ff46803e5a9c76045c85e6Erik 17473763464e8f0df4d387ff46803e5a9c76045c85e6Erik /** 1748c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Retrieves the days with events for the Julian days starting at 1749c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * "startDay" for "numDays". It returns a cursor containing startday and 1750c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * endday representing the max range of days for all events beginning on 1751c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * each startday.This is a blocking function and should not be done on 1752c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * the UI thread. 175358644028f909ecb429b26f909bedfb62a153d4e4RoboErik * 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr the ContentResolver 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startDay the first Julian day in the range 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param numDays the number of days to load (must be at least 1) 175758644028f909ecb429b26f909bedfb62a153d4e4RoboErik * @param projection the columns to return in the cursor 1758c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @return a database cursor containing a list of start and end days for 1759c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * events 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 176158644028f909ecb429b26f909bedfb62a153d4e4RoboErik public static final Cursor query(ContentResolver cr, int startDay, int numDays, 176258644028f909ecb429b26f909bedfb62a153d4e4RoboErik String[] projection) { 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numDays < 1) { 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int endDay = startDay + numDays - 1; 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.Builder builder = CONTENT_URI.buildUpon(); 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentUris.appendId(builder, startDay); 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentUris.appendId(builder, endDay); 177058644028f909ecb429b26f909bedfb62a153d4e4RoboErik return cr.query(builder.build(), projection, SELECTION, 17713763464e8f0df4d387ff46803e5a9c76045c85e6Erik null /* selection args */, STARTDAY); 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1775b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik protected interface RemindersColumns { 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1777c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The event the reminder belongs to. Column name. 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (foreign key to the Events table)</P> 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EVENT_ID = "event_id"; 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The minutes prior to the event that the alarm should ring. -1 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specifies that we should use the default value for the system. 1785c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Column name. 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String MINUTES = "minutes"; 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1790c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1791c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Passing this as a minutes value will use the default reminder 1792c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * minutes. 1793c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MINUTES_DEFAULT = -1; 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1797c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The alarm method, as set on the server. {@link #METHOD_DEFAULT}, 1798c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * {@link #METHOD_ALERT}, {@link #METHOD_EMAIL}, and {@link #METHOD_SMS} 1799c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * are possible values; the device will only process 1800c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * {@link #METHOD_DEFAULT} and {@link #METHOD_ALERT} reminders (the 1801c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * other types are simply stored so we can send the same reminder info 1802c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * back to the server when we make changes). 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String METHOD = "method"; 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int METHOD_DEFAULT = 0; 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int METHOD_ALERT = 1; 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int METHOD_EMAIL = 2; 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int METHOD_SMS = 3; 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1812c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 18133771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * Fields and helpers for accessing reminders for an event. Each row of this 18143771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * table represents a single reminder for an event. Calling 181558644028f909ecb429b26f909bedfb62a153d4e4RoboErik * {@link #query(ContentResolver, long, String[])} will return a list of reminders for 18163771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * the event with the given eventId. Both apps and sync adapters may write 18173771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * to this table. There are three writable fields and all of them must be 18183771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * included when inserting a new reminder. They are: 18193771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <ul> 18203771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <li>{@link #EVENT_ID}</li> 18213771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <li>{@link #MINUTES}</li> 18223771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <li>{@link #METHOD}</li> 18233771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * </ul> 1824c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Reminders implements BaseColumns, RemindersColumns, EventsColumns { 1826bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik private static final String REMINDERS_WHERE = CalendarContract.Reminders.EVENT_ID + "=?"; 1827c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik @SuppressWarnings("hiding") 1828a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/reminders"); 1829c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik 1830c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1831c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Queries all reminders associated with the given event. This is a 1832c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * blocking call and should not be done on the UI thread. 183358644028f909ecb429b26f909bedfb62a153d4e4RoboErik * 1834c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param cr The content resolver to use for the query 1835c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param eventId The id of the event to retrieve reminders for 183658644028f909ecb429b26f909bedfb62a153d4e4RoboErik * @param projection the columns to return in the cursor 1837c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @return A Cursor containing all reminders for the event 1838c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 183958644028f909ecb429b26f909bedfb62a153d4e4RoboErik public static final Cursor query(ContentResolver cr, long eventId, String[] projection) { 1840c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik String[] remArgs = {Long.toString(eventId)}; 184158644028f909ecb429b26f909bedfb62a153d4e4RoboErik return cr.query(CONTENT_URI, projection, REMINDERS_WHERE, remArgs /*selection args*/, 1842c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik null /* sort order */); 1843c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik } 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1846b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik protected interface CalendarAlertsColumns { 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1848c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The event that the alert belongs to. Column name. 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (foreign key to the Events table)</P> 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EVENT_ID = "event_id"; 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1854c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The start time of the event, in UTC. Column name. 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long; millis since epoch)</P> 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String BEGIN = "begin"; 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1860c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The end time of the event, in UTC. Column name. 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long; millis since epoch)</P> 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String END = "end"; 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1866c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The alarm time of the event, in UTC. Column name. 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long; millis since epoch)</P> 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ALARM_TIME = "alarmTime"; 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The creation time of this database entry, in UTC. 1873c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Useful for debugging missed reminders. Column name. 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long; millis since epoch)</P> 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CREATION_TIME = "creationTime"; 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The time that the alarm broadcast was received by the Calendar app, 1880c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * in UTC. Useful for debugging missed reminders. Column name. 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long; millis since epoch)</P> 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String RECEIVED_TIME = "receivedTime"; 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The time that the notification was created by the Calendar app, 1887c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * in UTC. Useful for debugging missed reminders. Column name. 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long; millis since epoch)</P> 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NOTIFY_TIME = "notifyTime"; 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1893083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * The state of this alert. It starts out as {@link #STATE_SCHEDULED}, then 1894083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * when the alarm goes off, it changes to {@link #STATE_FIRED}, and then when 1895083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * the user dismisses the alarm it changes to {@link #STATE_DISMISSED}. Column 1896c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * name. 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String STATE = "state"; 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1901083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik /** 1902083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * An alert begins in this state when it is first created. 1903083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik */ 1904083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik public static final int STATE_SCHEDULED = 0; 1905083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik /** 1906083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * After a notification for an alert has been created it should be 1907083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * updated to fired. 1908083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik */ 1909083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik public static final int STATE_FIRED = 1; 1910083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik /** 1911083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * Once the user has dismissed the notification the alert's state should 1912083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * be set to dismissed so it is not fired again. 1913083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik */ 1914083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik public static final int STATE_DISMISSED = 2; 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1917c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The number of minutes that this alarm precedes the start time. Column 1918c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * name. 1919c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * <P>Type: INTEGER</P> 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String MINUTES = "minutes"; 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1924c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The default sort order for this alerts queries 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1926cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan public static final String DEFAULT_SORT_ORDER = "begin ASC,title ASC"; 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1930c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Fields and helpers for accessing calendar alerts information. These 19313771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * fields are for tracking which alerts have been fired. Scheduled alarms 1932e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik * will generate an intent using {@link #ACTION_EVENT_REMINDER}. Apps that 19333771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * receive this action may update the {@link #STATE} for the reminder when 19343771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * they have finished handling it. Apps that have their notifications 19353771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * disabled should not modify the table to ensure that they do not conflict 19363771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * with another app that is generating a notification. In general, apps 19373771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * should not need to write to this table directly except to update the 19383771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * state of a reminder. 1939c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class CalendarAlerts implements BaseColumns, 1941e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik CalendarAlertsColumns, EventsColumns, CalendarColumns { 19421dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio 1943c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1944c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @hide 1945c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TABLE_NAME = "CalendarAlerts"; 1947c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1948c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The Uri for querying calendar alert information 1949c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 1950c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik @SuppressWarnings("hiding") 1951a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + 1952a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff "/calendar_alerts"); 19535b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff 19541dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio private static final String WHERE_ALARM_EXISTS = EVENT_ID + "=?" 19551dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio + " AND " + BEGIN + "=?" 19561dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio + " AND " + ALARM_TIME + "=?"; 19571dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio 19581dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio private static final String WHERE_FINDNEXTALARMTIME = ALARM_TIME + ">=?"; 19591dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio private static final String SORT_ORDER_ALARMTIME_ASC = ALARM_TIME + " ASC"; 19601dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio 1961083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik private static final String WHERE_RESCHEDULE_MISSED_ALARMS = STATE + "=" + STATE_SCHEDULED 19621dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio + " AND " + ALARM_TIME + "<?" 19631dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio + " AND " + ALARM_TIME + ">?" 19641dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio + " AND " + END + ">=?"; 19651dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This URI is for grouping the query results by event_id and begin 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time. This will return one result per instance of an event. So 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * events with multiple alarms will appear just once, but multiple 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instances of a repeating event will show up multiple times. 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19725b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff public static final Uri CONTENT_URI_BY_INSTANCE = 1973a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff Uri.parse("content://" + AUTHORITY + "/calendar_alerts/by_instance"); 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1975083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik private static final boolean DEBUG = false; 1976cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan 1977c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 1978083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * Helper for inserting an alarm time associated with an event TODO move 1979083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * to Provider 1980c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 1981c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @hide 1982c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri insert(ContentResolver cr, long eventId, 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long begin, long end, long alarmTime, int minutes) { 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues values = new ContentValues(); 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(CalendarAlerts.EVENT_ID, eventId); 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(CalendarAlerts.BEGIN, begin); 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(CalendarAlerts.END, end); 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(CalendarAlerts.ALARM_TIME, alarmTime); 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long currentTime = System.currentTimeMillis(); 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(CalendarAlerts.CREATION_TIME, currentTime); 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(CalendarAlerts.RECEIVED_TIME, 0); 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(CalendarAlerts.NOTIFY_TIME, 0); 1994083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik values.put(CalendarAlerts.STATE, STATE_SCHEDULED); 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(CalendarAlerts.MINUTES, minutes); 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.insert(CONTENT_URI, values); 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Finds the next alarm after (or equal to) the given time and returns 2001c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * the time of that alarm or -1 if no such alarm exists. This is a 2002083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * blocking call and should not be done on the UI thread. TODO move to 2003083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * provider 20045b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff * 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr the ContentResolver 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param millis the time in UTC milliseconds 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the next alarm time greater than or equal to "millis", or -1 2008c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * if no such alarm exists. 2009083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * @hide 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final long findNextAlarmTime(ContentResolver cr, long millis) { 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String selection = ALARM_TIME + ">=" + millis; 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: construct an explicit SQL query so that we can add 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // "LIMIT 1" to the end and get just one result. 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] projection = new String[] { ALARM_TIME }; 2016083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik Cursor cursor = cr.query(CONTENT_URI, projection, WHERE_FINDNEXTALARMTIME, 2017083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik (new String[] { 20181dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio Long.toString(millis) 2019083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik }), SORT_ORDER_ALARMTIME_ASC); 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long alarmTime = -1; 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor != null && cursor.moveToFirst()) { 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alarmTime = cursor.getLong(0); 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor != null) { 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alarmTime; 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20325b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Searches the CalendarAlerts table for alarms that should have fired 2035083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * but have not and then reschedules them. This method can be called at 2036083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * boot time to restore alarms that may have been lost due to a phone 2037083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * reboot. TODO move to provider 20385b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff * 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr the ContentResolver 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context the Context 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param manager the AlarmManager 2042083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * @hide 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final void rescheduleMissedAlarms(ContentResolver cr, 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context context, AlarmManager manager) { 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get all the alerts that have been scheduled but have not fired 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // and should have fired by now and are not too old. 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = System.currentTimeMillis(); 2049cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan long ancient = now - DateUtils.DAY_IN_MILLIS; 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] projection = new String[] { 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALARM_TIME, 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2053cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan 2054cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan // TODO: construct an explicit SQL query so that we can add 2055cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan // "GROUPBY" instead of doing a sort and de-dup 2056083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik Cursor cursor = cr.query(CalendarAlerts.CONTENT_URI, projection, 2057083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik WHERE_RESCHEDULE_MISSED_ALARMS, (new String[] { 2058083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik Long.toString(now), Long.toString(ancient), Long.toString(now) 2059083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik }), SORT_ORDER_ALARMTIME_ASC); 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor == null) { 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2063cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan 2064cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan if (DEBUG) { 2065105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Log.d(TAG, "missed alarms found: " + cursor.getCount()); 2066105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 20675b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2069cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan long alarmTime = -1; 2070cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (cursor.moveToNext()) { 2072cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan long newAlarmTime = cursor.getLong(0); 2073cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan if (alarmTime != newAlarmTime) { 2074cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan if (DEBUG) { 2075cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan Log.w(TAG, "rescheduling missed alarm. alarmTime: " + newAlarmTime); 2076cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan } 2077cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan scheduleAlarm(context, manager, newAlarmTime); 2078cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan alarmTime = newAlarmTime; 2079cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan } 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2084cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan } 2085cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan 2086c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 2087c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Schedules an alarm intent with the system AlarmManager that will 20883771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * notify listeners when a reminder should be fired. The provider will 20893771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * keep scheduled reminders up to date but apps may use this to 20903771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * implement snooze functionality without modifying the reminders table. 20913771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * Scheduled alarms will generate an intent using 2092083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * {@link #ACTION_EVENT_REMINDER}. TODO Move to provider 2093c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * 2094c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param context A context for referencing system resources 2095c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param manager The AlarmManager to use or null 2096c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @param alarmTime The time to fire the intent in UTC millis since 2097c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * epoch 2098083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * @hide 2099c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 2100cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan public static void scheduleAlarm(Context context, AlarmManager manager, long alarmTime) { 2101cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan if (DEBUG) { 2102cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan Time time = new Time(); 2103cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan time.set(alarmTime); 2104cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan String schedTime = time.format(" %a, %b %d, %Y %I:%M%P"); 2105cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan Log.d(TAG, "Schedule alarm at " + alarmTime + " " + schedTime); 2106cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan } 2107cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan 2108cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan if (manager == null) { 2109cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 2110cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan } 21115b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff 2112e00d58998cf5e36bbb744e6412623d7f35a15da1RoboErik Intent intent = new Intent(ACTION_EVENT_REMINDER); 2113bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik intent.setData(ContentUris.withAppendedId(CalendarContract.CONTENT_URI, alarmTime)); 21141dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio intent.putExtra(ALARM_TIME, alarmTime); 211542f1957817c3bda0c002e2c987f2a8bbe320f755Erik PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 2116cdaeafd440e61e1b64fbd46107157f3c74d1c09cMichael Chan manager.set(AlarmManager.RTC_WAKEUP, alarmTime, pi); 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21185b387e16f7551921ae7d33b93838a22f370b9a54Ken Shirriff 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2120083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * Searches for an entry in the CalendarAlerts table that matches the 2121083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * given event id, begin time and alarm time. If one is found then this 2122083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * alarm already exists and this method returns true. TODO Move to 2123083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * provider 212458644028f909ecb429b26f909bedfb62a153d4e4RoboErik * 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr the ContentResolver 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param eventId the event id to match 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param begin the start time of the event in UTC millis 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param alarmTime the alarm time of the event in UTC millis 2129083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * @return true if there is already an alarm for the given event with 2130083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * the same start time and alarm time. 2131083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik * @hide 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final boolean alarmExists(ContentResolver cr, long eventId, 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long begin, long alarmTime) { 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: construct an explicit SQL query so that we can add 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // "LIMIT 1" to the end and get just one result. 21371dfc8a25182467efde6956fdee4a077a10238f77Fabrice Di Meglio String[] projection = new String[] { ALARM_TIME }; 2138083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik Cursor cursor = cr.query(CONTENT_URI, projection, WHERE_ALARM_EXISTS, 2139083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik (new String[] { 2140083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik Long.toString(eventId), Long.toString(begin), Long.toString(alarmTime) 2141083cd2dfeb4b35b0b888921b02aa28464fa53165RoboErik }), null); 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean found = false; 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor != null && cursor.getCount() > 0) { 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project found = true; 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor != null) { 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.close(); 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return found; 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2156b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik protected interface ExtendedPropertiesColumns { 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2158c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The event the extended property belongs to. Column name. 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (foreign key to the Events table)</P> 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EVENT_ID = "event_id"; 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the extended property. This is a uri of the form 2165c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * {scheme}#{local-name} convention. Column name. 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NAME = "name"; 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2171c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The value of the extended property. Column name. 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String VALUE = "value"; 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2177c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 2178c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * Fields for accessing the Extended Properties. This is a generic set of 2179c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * name/value pairs for use by sync adapters or apps to add extra 21803771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * information to events. There are three writable columns and all three 21813771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * must be present when inserting a new value. They are: 21823771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <ul> 21833771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <li>{@link #EVENT_ID}</li> 21843771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <li>{@link #NAME}</li> 21853771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * <li>{@link #VALUE}</li> 21863771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * </ul> 2187c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class ExtendedProperties implements BaseColumns, 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ExtendedPropertiesColumns, EventsColumns { 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri CONTENT_URI = 2191a69a23b2a5fa7738a5c5c3b74865f20308a96190Ken Shirriff Uri.parse("content://" + AUTHORITY + "/extendedproperties"); 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: fill out this class when we actually start utilizing extendedproperties 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in the calendar application. 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2196ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff 2197ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff /** 2198ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff * A table provided for sync adapters to use for storing private sync state data. 2199ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff * 2200ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff * @see SyncStateContract 2201ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff */ 2202ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff public static final class SyncState implements SyncStateContract.Columns { 2203ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff /** 2204ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff * This utility class cannot be instantiated 2205ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff */ 2206ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff private SyncState() {} 2207ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff 2208c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik private static final String CONTENT_DIRECTORY = 2209ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff SyncStateContract.Constants.CONTENT_DIRECTORY; 2210ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff 2211ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff /** 2212ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff * The content:// style URI for this table 2213ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff */ 2214ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff public static final Uri CONTENT_URI = 2215bec6c36b96f7bc415af18abbb142bd51a1741796RoboErik Uri.withAppendedPath(CalendarContract.CONTENT_URI, CONTENT_DIRECTORY); 2216ead4f9cef59647a7f980efa2fdcc8c7e17c8def1Ken Shirriff } 2217505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio 2218505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio /** 2219505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio * Columns from the EventsRawTimes table 22203771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * 22213771fcbc192386d96b57d1edec44d53620d9f09dRoboErik * @hide 2222505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio */ 2223b2c75603b3ccf2bcfcda66e9dfb835a119f2e5a3RoboErik protected interface EventsRawTimesColumns { 2224505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio /** 2225c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The corresponding event id. Column name. 2226505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio * <P>Type: INTEGER (long)</P> 2227505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio */ 2228505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio public static final String EVENT_ID = "event_id"; 2229505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio 2230505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio /** 2231c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The RFC2445 compliant time the event starts. Column name. 2232505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio * <P>Type: TEXT</P> 2233505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio */ 2234505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio public static final String DTSTART_2445 = "dtstart2445"; 2235505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio 2236505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio /** 2237c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The RFC2445 compliant time the event ends. Column name. 2238505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio * <P>Type: TEXT</P> 2239505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio */ 2240505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio public static final String DTEND_2445 = "dtend2445"; 2241505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio 2242505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio /** 2243c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The RFC2445 compliant original instance time of the recurring event 2244c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * for which this event is an exception. Column name. 2245505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio * <P>Type: TEXT</P> 2246505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio */ 2247505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio public static final String ORIGINAL_INSTANCE_TIME_2445 = "originalInstanceTime2445"; 2248505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio 2249505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio /** 2250c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * The RFC2445 compliant last date this event repeats on, or NULL if it 2251c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * never ends. Column name. 2252505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio * <P>Type: TEXT</P> 2253505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio */ 2254505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio public static final String LAST_DATE_2445 = "lastDate2445"; 2255505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio } 2256505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio 2257c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik /** 2258c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik * @hide 2259c2d5330c1cc340ec5b23de14481f1db2e21a6c32RoboErik */ 2260505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio public static final class EventsRawTimes implements BaseColumns, EventsRawTimesColumns { 2261505635583bf49339a0ec8da00851b2fba2db3478Fabrice Di Meglio } 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2263