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