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