1ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank/* 2ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * Copyright (C) 2008-2009 Marc Blank 3ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * Licensed to The Android Open Source Project. 4ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * 5ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * Licensed under the Apache License, Version 2.0 (the "License"); 6ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * you may not use this file except in compliance with the License. 7ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * You may obtain a copy of the License at 8ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * 9ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * http://www.apache.org/licenses/LICENSE-2.0 10ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * 11ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * Unless required by applicable law or agreed to in writing, software 12ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * distributed under the License is distributed on an "AS IS" BASIS, 13ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * See the License for the specific language governing permissions and 15ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * limitations under the License. 16ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank */ 17ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank 18ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blankpackage com.android.exchange; 19ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank 20ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Huimport com.android.emailcommon.provider.Mailbox; 21c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blankimport com.android.emailcommon.service.EmailServiceProxy; 22942b7d73f2f5b3d6c651e39463e615fe6902a910Scott Kennedyimport com.android.mail.utils.LogUtils; 23c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank 24ab9c23bcf59ec01a3dd79000b7b4136791a9db65Yu Ping Huimport java.text.SimpleDateFormat; 25ab9c23bcf59ec01a3dd79000b7b4136791a9db65Yu Ping Huimport java.util.Locale; 26ab9c23bcf59ec01a3dd79000b7b4136791a9db65Yu Ping Huimport java.util.TimeZone; 27ab9c23bcf59ec01a3dd79000b7b4136791a9db65Yu Ping Hu 28ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank/** 29ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * Constants used throughout the EAS implementation are stored here. 30ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank * 31ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank */ 32ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blankpublic class Eas { 339383babdbd7c0049a0eb238819a5d9737232e8ecYu Ping Hu 349383babdbd7c0049a0eb238819a5d9737232e8ecYu Ping Hu // For logging. 35110837ebff288a75f9bda067c38e2c46797d99b5Alon Albert public static final String LOG_TAG = "Exchange"; 369383babdbd7c0049a0eb238819a5d9737232e8ecYu Ping Hu 377c582a7fb883b3be728f270fbe5277676fe37cf9Marc Blank // For debugging 387c582a7fb883b3be728f270fbe5277676fe37cf9Marc Blank public static boolean WAIT_DEBUG = false; // DO NOT CHECK IN WITH THIS SET TO TRUE 3977424af660458104b732bdcb718874b17d0cab3aMarc Blank public static boolean DEBUG = false; // DO NOT CHECK IN WITH THIS SET TO TRUE 40ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank 417c582a7fb883b3be728f270fbe5277676fe37cf9Marc Blank // The following two are for user logging (the second providing more detail) 427c582a7fb883b3be728f270fbe5277676fe37cf9Marc Blank public static boolean USER_LOG = false; // DO NOT CHECK IN WITH THIS SET TO TRUE 437c582a7fb883b3be728f270fbe5277676fe37cf9Marc Blank public static boolean PARSER_LOG = false; // DO NOT CHECK IN WITH THIS SET TO TRUE 4477424af660458104b732bdcb718874b17d0cab3aMarc Blank public static boolean FILE_LOG = false; // DO NOT CHECK IN WITH THIS SET TO TRUE 4577424af660458104b732bdcb718874b17d0cab3aMarc Blank 4677e0f0dc7b064e0a320d11c33ce9da2f8ae5ba3bMarc Blank public static final String CLIENT_VERSION = "EAS-1.3"; 47e8ea6833e0541f0a0a3ceb1d78c84ac9ce359210Marc Blank public static final String ACCOUNT_MAILBOX_PREFIX = "__eas"; 4822bc4e0e4f4a5e43e4eea8d59e1961860c507594Marc Blank 49d5fadc87ea52aee033afd476369b29b29bfd434fMarc Blank // Define our default protocol version as 2.5 (Exchange 2003) 50d5fadc87ea52aee033afd476369b29b29bfd434fMarc Blank public static final String SUPPORTED_PROTOCOL_EX2003 = "2.5"; 51d5fadc87ea52aee033afd476369b29b29bfd434fMarc Blank public static final double SUPPORTED_PROTOCOL_EX2003_DOUBLE = 2.5; 52d5fadc87ea52aee033afd476369b29b29bfd434fMarc Blank public static final String SUPPORTED_PROTOCOL_EX2007 = "12.0"; 53d5fadc87ea52aee033afd476369b29b29bfd434fMarc Blank public static final double SUPPORTED_PROTOCOL_EX2007_DOUBLE = 12.0; 54e7d9602fce0d4b404d68716da7eb0567da9dad47Marc Blank public static final String SUPPORTED_PROTOCOL_EX2007_SP1 = "12.1"; 55e7d9602fce0d4b404d68716da7eb0567da9dad47Marc Blank public static final double SUPPORTED_PROTOCOL_EX2007_SP1_DOUBLE = 12.1; 5677186bb1a174432ef272584374942d8b9228e39cMarc Blank public static final String SUPPORTED_PROTOCOL_EX2010 = "14.0"; 5777186bb1a174432ef272584374942d8b9228e39cMarc Blank public static final double SUPPORTED_PROTOCOL_EX2010_DOUBLE = 14.0; 5877186bb1a174432ef272584374942d8b9228e39cMarc Blank public static final String SUPPORTED_PROTOCOL_EX2010_SP1 = "14.1"; 5977186bb1a174432ef272584374942d8b9228e39cMarc Blank public static final double SUPPORTED_PROTOCOL_EX2010_SP1_DOUBLE = 14.1; 60d5fadc87ea52aee033afd476369b29b29bfd434fMarc Blank public static final String DEFAULT_PROTOCOL_VERSION = SUPPORTED_PROTOCOL_EX2003; 61d5fadc87ea52aee033afd476369b29b29bfd434fMarc Blank 622bf91acb8174aab82582ce975a4b60702c810a9cMarc Blank public static final String EXCHANGE_ACCOUNT_MANAGER_TYPE = 639b65e23aebade9eb057070af3757f490a06148d3Yu Ping Hu com.android.exchange.Configuration.EXCHANGE_ACCOUNT_MANAGER_TYPE; 649b65e23aebade9eb057070af3757f490a06148d3Yu Ping Hu public static final String PROTOCOL = com.android.exchange.Configuration.EXCHANGE_PROTOCOL; 652bf91acb8174aab82582ce975a4b60702c810a9cMarc Blank public static final String EXCHANGE_SERVICE_INTENT_ACTION = 669b65e23aebade9eb057070af3757f490a06148d3Yu Ping Hu com.android.exchange.Configuration.EXCHANGE_SERVICE_INTENT_ACTION; 67c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank 68ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank // From EAS spec 69ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank // Mail Cal 70ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank // 0 No filter Yes Yes 71ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank // 1 1 day ago Yes No 72ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank // 2 3 days ago Yes No 73ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank // 3 1 week ago Yes No 74ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank // 4 2 weeks ago Yes Yes 75ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank // 5 1 month ago Yes Yes 76ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank // 6 3 months ago No Yes 77ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank // 7 6 months ago No Yes 78ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank 790565fd4f943aa3e5be5e001fb16d2f3d69159de6Marc Blank // TODO Rationalize this with SYNC_WINDOW_ALL 8000d91b2e12d65df06916afdc4bebca67fd27214cMarc Blank public static final String FILTER_ALL = "0"; 819b65e23aebade9eb057070af3757f490a06148d3Yu Ping Hu public static final String FILTER_1_DAY = "1"; 829b65e23aebade9eb057070af3757f490a06148d3Yu Ping Hu public static final String FILTER_3_DAYS = "2"; 839b65e23aebade9eb057070af3757f490a06148d3Yu Ping Hu public static final String FILTER_1_WEEK = "3"; 849b65e23aebade9eb057070af3757f490a06148d3Yu Ping Hu public static final String FILTER_2_WEEKS = "4"; 859b65e23aebade9eb057070af3757f490a06148d3Yu Ping Hu public static final String FILTER_1_MONTH = "5"; 8600d91b2e12d65df06916afdc4bebca67fd27214cMarc Blank public static final String FILTER_3_MONTHS = "6"; 8700d91b2e12d65df06916afdc4bebca67fd27214cMarc Blank public static final String FILTER_6_MONTHS = "7"; 880565fd4f943aa3e5be5e001fb16d2f3d69159de6Marc Blank 8900d91b2e12d65df06916afdc4bebca67fd27214cMarc Blank public static final String BODY_PREFERENCE_TEXT = "1"; 9000d91b2e12d65df06916afdc4bebca67fd27214cMarc Blank public static final String BODY_PREFERENCE_HTML = "2"; 910565fd4f943aa3e5be5e001fb16d2f3d69159de6Marc Blank 924f15001bdfd11c79524b4e44d60041967779e763Marc Blank public static final String MIME_BODY_PREFERENCE_TEXT = "0"; 934f15001bdfd11c79524b4e44d60041967779e763Marc Blank public static final String MIME_BODY_PREFERENCE_MIME = "2"; 94ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank 95774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert // Mailbox Types 96774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert // Section 2.2.3.170.3 Type (FolderSync) 97774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert // http://msdn.microsoft.com/en-us/library/gg650877(v=exchg.80).aspx 98774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert public static final int MAILBOX_TYPE_USER_GENERIC = 1; 99774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert public static final int MAILBOX_TYPE_INBOX = 2; 100774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert public static final int MAILBOX_TYPE_DRAFTS = 3; 101774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert public static final int MAILBOX_TYPE_DELETED = 4; 102774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert public static final int MAILBOX_TYPE_SENT = 5; 103774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert public static final int MAILBOX_TYPE_OUTBOX = 6; 104774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert// public static final int MAILBOX_TYPE_TASKS = 7; 105774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert public static final int MAILBOX_TYPE_CALENDAR = 8; 106774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert public static final int MAILBOX_TYPE_CONTACTS = 9; 107774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert// public static final int MAILBOX_TYPE_NOTES = 10; 108774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert// public static final int MAILBOX_TYPE_JOURNAL = 11; 109774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert public static final int MAILBOX_TYPE_USER_MAIL = 12; 110774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert public static final int MAILBOX_TYPE_USER_CALENDAR = 13; 111774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert public static final int MAILBOX_TYPE_USER_CONTACTS = 14; 112774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert// public static final int MAILBOX_TYPE_USER_TASKS = 15; 113774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert// public static final int MAILBOX_TYPE_USER_JOURNAL = 16; 114774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert// public static final int MAILBOX_TYPE_USER_NOTES = 17; 115774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert// public static final int MAILBOX_TYPE_UNKNOWN = 18; 116774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert// public static final int MAILBOX_TYPE_RECIPIENT_INFORMATION_CACHE = 19; 117774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert 118774b28589925b8610e436d1fb52b2086b2d3ac7dAlon Albert 11936e181376b06c8905af2d22bf494a2423f50aa65Alon Albert // These limits must never exceed about 500k which is half the max size of a Binder IPC buffer. 12036e181376b06c8905af2d22bf494a2423f50aa65Alon Albert 121895d1e3132622653160516d420231ed366ab411bMarc Blank // For EAS 12, we use HTML, so we want a larger size than in EAS 2.5 122895d1e3132622653160516d420231ed366ab411bMarc Blank public static final String EAS12_TRUNCATION_SIZE = "200000"; 123895d1e3132622653160516d420231ed366ab411bMarc Blank // For EAS 2.5, truncation is a code; the largest is "7", which is 100k 124895d1e3132622653160516d420231ed366ab411bMarc Blank public static final String EAS2_5_TRUNCATION_SIZE = "7"; 125ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank 126ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank public static final int FOLDER_STATUS_OK = 1; 127ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank public static final int FOLDER_STATUS_INVALID_KEY = 9; 128ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank 129ed5b71376cb6fc3f54d63268afbd798e0b0c0a1bMarc Blank public static final int EXCHANGE_ERROR_NOTIFICATION = 0x10; 130ed5b71376cb6fc3f54d63268afbd798e0b0c0a1bMarc Blank 13177424af660458104b732bdcb718874b17d0cab3aMarc Blank public static void setUserDebug(int state) { 1327c582a7fb883b3be728f270fbe5277676fe37cf9Marc Blank // DEBUG takes precedence and is never true in a user build 1337c582a7fb883b3be728f270fbe5277676fe37cf9Marc Blank if (!DEBUG) { 134c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank USER_LOG = (state & EmailServiceProxy.DEBUG_BIT) != 0; 135c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank PARSER_LOG = (state & EmailServiceProxy.DEBUG_VERBOSE_BIT) != 0; 136c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank FILE_LOG = (state & EmailServiceProxy.DEBUG_FILE_BIT) != 0; 13742f891bb2c7465686ecbf864680ec2359d8960aeMarc Blank if (FILE_LOG || PARSER_LOG) { 13877424af660458104b732bdcb718874b17d0cab3aMarc Blank USER_LOG = true; 13977424af660458104b732bdcb718874b17d0cab3aMarc Blank } 140942b7d73f2f5b3d6c651e39463e615fe6902a910Scott Kennedy LogUtils.d("Eas Debug", "Logging: " + (USER_LOG ? "User " : "") + 14177424af660458104b732bdcb718874b17d0cab3aMarc Blank (PARSER_LOG ? "Parser " : "") + (FILE_LOG ? "File" : "")); 1427c582a7fb883b3be728f270fbe5277676fe37cf9Marc Blank } 143cb5c48824628e93e98ca24edec46f05c54851af1Marc Blank } 144cb5c48824628e93e98ca24edec46f05c54851af1Marc Blank 145cb5c48824628e93e98ca24edec46f05c54851af1Marc Blank static public Double getProtocolVersionDouble(String version) { 146cb5c48824628e93e98ca24edec46f05c54851af1Marc Blank if (SUPPORTED_PROTOCOL_EX2003.equals(version)) { 147cb5c48824628e93e98ca24edec46f05c54851af1Marc Blank return SUPPORTED_PROTOCOL_EX2003_DOUBLE; 148cb5c48824628e93e98ca24edec46f05c54851af1Marc Blank } else if (SUPPORTED_PROTOCOL_EX2007.equals(version)) { 149cb5c48824628e93e98ca24edec46f05c54851af1Marc Blank return SUPPORTED_PROTOCOL_EX2007_DOUBLE; 150cb5c48824628e93e98ca24edec46f05c54851af1Marc Blank } if (SUPPORTED_PROTOCOL_EX2007_SP1.equals(version)) { 151cb5c48824628e93e98ca24edec46f05c54851af1Marc Blank return SUPPORTED_PROTOCOL_EX2007_SP1_DOUBLE; 15277186bb1a174432ef272584374942d8b9228e39cMarc Blank } if (SUPPORTED_PROTOCOL_EX2010.equals(version)) { 15377186bb1a174432ef272584374942d8b9228e39cMarc Blank return SUPPORTED_PROTOCOL_EX2010_DOUBLE; 15477186bb1a174432ef272584374942d8b9228e39cMarc Blank } if (SUPPORTED_PROTOCOL_EX2010_SP1.equals(version)) { 15577186bb1a174432ef272584374942d8b9228e39cMarc Blank return SUPPORTED_PROTOCOL_EX2010_SP1_DOUBLE; 156cb5c48824628e93e98ca24edec46f05c54851af1Marc Blank } 157cb5c48824628e93e98ca24edec46f05c54851af1Marc Blank throw new IllegalArgumentException("illegal protocol version"); 158cb5c48824628e93e98ca24edec46f05c54851af1Marc Blank } 159ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu 160ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu /** 161ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu * Gets the Exchange folder class for a mailbox type (PIM collections have different values 162ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu * from email), needed when forming the request. 163ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu * @param mailboxType The type of the mailbox we're interested in, from {@link Mailbox}. 164ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu * @return The folder class for the mailbox we're interested in. 165ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu */ 166ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu public static String getFolderClass(final int mailboxType) { 167ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu switch (mailboxType) { 168ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu case Mailbox.TYPE_CALENDAR: 169ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu return "Calendar"; 170ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu case Mailbox.TYPE_CONTACTS: 171ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu return "Contacts"; 172ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu default: 173ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu return "Email"; 174ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu } 175ff7e02603bc8196f411c0c491d74a42e747b7dc5Yu Ping Hu } 176ab9c23bcf59ec01a3dd79000b7b4136791a9db65Yu Ping Hu 177ab9c23bcf59ec01a3dd79000b7b4136791a9db65Yu Ping Hu // Time format documented at http://msdn.microsoft.com/en-us/library/ee201818(v=exchg.80).aspx 178ab9c23bcf59ec01a3dd79000b7b4136791a9db65Yu Ping Hu public static final SimpleDateFormat DATE_FORMAT; 179ab9c23bcf59ec01a3dd79000b7b4136791a9db65Yu Ping Hu static { 180ab9c23bcf59ec01a3dd79000b7b4136791a9db65Yu Ping Hu DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S'Z'", Locale.US); 181ab9c23bcf59ec01a3dd79000b7b4136791a9db65Yu Ping Hu DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); 182ab9c23bcf59ec01a3dd79000b7b4136791a9db65Yu Ping Hu } 183ab30d429e0c6069604aead9b5e6845b6b91b6a02Marc Blank} 184