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