133fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira/**
233fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira * Copyright (c) 2012, Google Inc.
333fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira *
433fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira * Licensed under the Apache License, Version 2.0 (the "License");
533fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira * you may not use this file except in compliance with the License.
633fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira * You may obtain a copy of the License at
733fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira *
833fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira *     http://www.apache.org/licenses/LICENSE-2.0
933fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira *
1033fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira * Unless required by applicable law or agreed to in writing, software
1133fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS,
1233fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1333fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira * See the License for the specific language governing permissions and
1433fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira * limitations under the License.
1533fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira */
1633fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira
1733fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereirapackage com.android.mail.providers;
1833fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira
19c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yangimport android.content.ContentResolver;
200d0f8b061faae060529af4da339eed2d728ef1bdScott Kennedyimport android.content.ContentValues;
2133fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereiraimport android.database.Cursor;
22d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedyimport android.database.MatrixCursor;
23cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereiraimport android.net.Uri;
2433fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereiraimport android.os.Parcel;
251ddcf0f2bf44d3c9db89112ef52510d9b2433ac4Vikram Aggarwalimport android.os.Parcelable;
26518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereiraimport android.text.TextUtils;
27518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereira
28177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwalimport com.android.mail.content.CursorCreator;
29177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwalimport com.android.mail.content.ObjectCursor;
301617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huangimport com.android.mail.providers.UIProvider.AccountCapabilities;
31d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedyimport com.android.mail.providers.UIProvider.AccountColumns;
32b287833c2645e2502792821e54d7226cfad59955Marc Blankimport com.android.mail.providers.UIProvider.SyncStatus;
33b334c9035e9b7a38766bb66c29da2208525d1e11Paul Westbrookimport com.android.mail.utils.LogTag;
34b287833c2645e2502792821e54d7226cfad59955Marc Blankimport com.android.mail.utils.LogUtils;
35b287833c2645e2502792821e54d7226cfad59955Marc Blankimport com.android.mail.utils.Utils;
36e26853a5f7c19fc037a2ff5223adcd66596b9b2cMilos Stankovicimport com.google.android.mail.common.base.Preconditions;
37e26853a5f7c19fc037a2ff5223adcd66596b9b2cMilos Stankovicimport com.google.android.mail.common.base.Strings;
38db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrookimport com.google.common.base.Objects;
391617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huangimport com.google.common.collect.Lists;
4033fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira
411617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huangimport org.json.JSONArray;
426dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwalimport org.json.JSONException;
436dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwalimport org.json.JSONObject;
446dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal
45d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedyimport java.util.HashMap;
461617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huangimport java.util.List;
47d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedyimport java.util.Map;
481617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang
493e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantlerpublic class Account implements Parcelable {
50b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook    private static final String SETTINGS_KEY = "settings";
51b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook
5233fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira    /**
533e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler     * Human readable account name. Not guaranteed to be the account's email address, nor to match
543e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler     * the system account manager.
553e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler     */
5626a20758413f0f8629ea71a0943304e3ae740165Tony Mantler    private final String displayName;
573e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler
583e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler    /**
59bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler     * The real name associated with the account, e.g. "John Doe"
60bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler     */
61bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler    private final String senderName;
62bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler
63bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler    /**
643e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler     * Account manager name. MUST MATCH SYSTEM ACCOUNT MANAGER NAME
653e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler     */
663e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler    private final String accountManagerName;
673e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler
683e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler    /**
69e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen     * An unique ID to represent this account.
70e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen     */
71e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen    private String accountId;
72e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen
73e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen    /**
743e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler     * Account type. MUST MATCH SYSTEM ACCOUNT MANAGER TYPE
753e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler     */
763e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler    private final String type;
773e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler
783e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler    /**
79b90a813b107d8f43236e2d3fe12f299d94c82ce8Tony Mantler     * Cached android.accounts.Account based on the above two values
80b90a813b107d8f43236e2d3fe12f299d94c82ce8Tony Mantler     */
81b90a813b107d8f43236e2d3fe12f299d94c82ce8Tony Mantler    private android.accounts.Account amAccount;
82b90a813b107d8f43236e2d3fe12f299d94c82ce8Tony Mantler
83b90a813b107d8f43236e2d3fe12f299d94c82ce8Tony Mantler    /**
8433fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     * The version of the UI provider schema from which this account provider
8533fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     * will return results.
8633fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     */
872861b6a649090ce1401b4bb04dd87df5bb26472bPaul Westbrook    public final int providerVersion;
8833fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira
8933fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira    /**
9033fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     * The uri to directly access the information for this account.
9133fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     */
92cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira    public final Uri uri;
9333fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira
9433fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira    /**
9533fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     * The possible capabilities that this account supports.
9633fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     */
972861b6a649090ce1401b4bb04dd87df5bb26472bPaul Westbrook    public final int capabilities;
9833fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira
9933fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira    /**
10033fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     * The content provider uri to return the list of top level folders for this
10133fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     * account.
10233fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     */
103cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira    public final Uri folderListUri;
10431d7967c857d7486f27329135dffb3a2977b54e2Mindy Pereira    /**
105009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler     * The content provider uri to return the list of all real folders for this
10631d7967c857d7486f27329135dffb3a2977b54e2Mindy Pereira     * account.
10731d7967c857d7486f27329135dffb3a2977b54e2Mindy Pereira     */
10831d7967c857d7486f27329135dffb3a2977b54e2Mindy Pereira    public Uri fullFolderListUri;
10933fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira    /**
110009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler     * The content provider uri to return the list of all real and synthetic folders for this
111009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler     * account.
112009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler     */
113009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler    public Uri allFolderListUri;
114009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler    /**
11533fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     * The content provider uri that can be queried for search results.
11633fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     */
117cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira    public final Uri searchUri;
11833fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira
11933fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira    /**
12092551d057965689f1952faeb06763f0762bc717fMindy Pereira     * The custom from addresses for this account or null if there are none.
12133fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira     */
1221883b346928322a9f045bc5b7426ddcd6af9beb3Mindy Pereira    public String accountFromAddresses;
12333fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira
12433fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira    /**
12582cc5665cb18801022cd60cd52abcd16a50debdcMindy Pereira     * The content provider uri that can be used to expunge message from this
12682cc5665cb18801022cd60cd52abcd16a50debdcMindy Pereira     * account. NOTE: This might be better to be an update operation on the
12782cc5665cb18801022cd60cd52abcd16a50debdcMindy Pereira     * messageUri.
12882cc5665cb18801022cd60cd52abcd16a50debdcMindy Pereira     */
129cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira    public final Uri expungeMessageUri;
13082cc5665cb18801022cd60cd52abcd16a50debdcMindy Pereira
13196b5c357860f46a7bd5f867774a53d5cc5069defMindy Pereira    /**
13296b5c357860f46a7bd5f867774a53d5cc5069defMindy Pereira     * The content provider uri that can be used to undo the last operation
13396b5c357860f46a7bd5f867774a53d5cc5069defMindy Pereira     * performed.
13496b5c357860f46a7bd5f867774a53d5cc5069defMindy Pereira     */
135cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira    public final Uri undoUri;
13696b5c357860f46a7bd5f867774a53d5cc5069defMindy Pereira
1379600dac67c5b3844b3a43a229bf3c309d84f978cMindy Pereira    /**
1389912eee82731d0cbf2c6cf35e62c8388c2a9ee79Paul Westbrook     * Uri for EDIT intent that will cause the settings screens for this account type to be
1392861b6a649090ce1401b4bb04dd87df5bb26472bPaul Westbrook     * shown.
1402861b6a649090ce1401b4bb04dd87df5bb26472bPaul Westbrook     */
141dac00547ce8d44a964e4510315168ee413e55a75Mindy Pereira    public final Uri settingsIntentUri;
1429600dac67c5b3844b3a43a229bf3c309d84f978cMindy Pereira
1439ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank    /**
14494e440d7fb9bb54ba4b22e348a2e22f3cf8e0167Paul Westbrook     * Uri for VIEW intent that will cause the help screens for this account type to be
14594e440d7fb9bb54ba4b22e348a2e22f3cf8e0167Paul Westbrook     * shown.
14694e440d7fb9bb54ba4b22e348a2e22f3cf8e0167Paul Westbrook     */
147cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira    public final Uri helpIntentUri;
14894e440d7fb9bb54ba4b22e348a2e22f3cf8e0167Paul Westbrook
14994e440d7fb9bb54ba4b22e348a2e22f3cf8e0167Paul Westbrook    /**
150517743ef4e3e4ac103a3c096b9e3c894da7ed87aPaul Westbrook     * Uri for VIEW intent that will cause the send feedback screens for this account type to be
151517743ef4e3e4ac103a3c096b9e3c894da7ed87aPaul Westbrook     * shown.
152517743ef4e3e4ac103a3c096b9e3c894da7ed87aPaul Westbrook     */
153517743ef4e3e4ac103a3c096b9e3c894da7ed87aPaul Westbrook    public final Uri sendFeedbackIntentUri;
154517743ef4e3e4ac103a3c096b9e3c894da7ed87aPaul Westbrook
155517743ef4e3e4ac103a3c096b9e3c894da7ed87aPaul Westbrook    /**
156122f7c2cf45cd5f07462a7b0a553f82828a8b1a2Paul Westbrook     * Uri for VIEW intent that will cause the reauthentication screen for this account to be
157122f7c2cf45cd5f07462a7b0a553f82828a8b1a2Paul Westbrook     * shown.
158122f7c2cf45cd5f07462a7b0a553f82828a8b1a2Paul Westbrook     */
159122f7c2cf45cd5f07462a7b0a553f82828a8b1a2Paul Westbrook    public final Uri reauthenticationIntentUri;
160122f7c2cf45cd5f07462a7b0a553f82828a8b1a2Paul Westbrook
161122f7c2cf45cd5f07462a7b0a553f82828a8b1a2Paul Westbrook    /**
1629ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank     * The sync status of the account
1639ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank     */
1649ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank    public final int syncStatus;
1659ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank
166518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereira    /**
16723755e2109c3f97e3b51857e4a81355b1a3995a7Mindy Pereira     * Uri for VIEW intent that will cause the compose screen for this account type to be
16823755e2109c3f97e3b51857e4a81355b1a3995a7Mindy Pereira     * shown.
16923755e2109c3f97e3b51857e4a81355b1a3995a7Mindy Pereira     */
170cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira    public final Uri composeIntentUri;
17123755e2109c3f97e3b51857e4a81355b1a3995a7Mindy Pereira
172898cd38018ff4331e79262451f464efa9dc5d43eMindy Pereira    public final String mimeType;
1732168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps
17423755e2109c3f97e3b51857e4a81355b1a3995a7Mindy Pereira    /**
17530fd47bf1947da5ad813cb957b6cbe569dce563aMindy Pereira     * URI for recent folders for this account.
17627e85f244604c8de53b76b135e0dd6f2bf3cad96Vikram Aggarwal     */
17727e85f244604c8de53b76b135e0dd6f2bf3cad96Vikram Aggarwal    public final Uri recentFolderListUri;
1782168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps
179b287833c2645e2502792821e54d7226cfad59955Marc Blank    /**
180b287833c2645e2502792821e54d7226cfad59955Marc Blank     * The color used for this account in combined view (Email)
181b287833c2645e2502792821e54d7226cfad59955Marc Blank     */
182b287833c2645e2502792821e54d7226cfad59955Marc Blank    public final int color;
18327d89ada3e8d1b17357a7064e1f47f3c15686412Vikram Aggarwal    /**
18427d89ada3e8d1b17357a7064e1f47f3c15686412Vikram Aggarwal     * URI for default recent folders for this account, if any.
18527d89ada3e8d1b17357a7064e1f47f3c15686412Vikram Aggarwal     */
18627d89ada3e8d1b17357a7064e1f47f3c15686412Vikram Aggarwal    public final Uri defaultRecentFolderListUri;
1872168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps
188b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook    /**
189b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook     * Settings object for this account.
190b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook     */
191b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook    public final Settings settings;
192b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook
193b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira    /**
194b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira     * URI for forcing a manual sync of this account.
195b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira     */
196b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira    public final Uri manualSyncUri;
197b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira
1981617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang    /**
1999982fdb413d09b8e391dbc96a114987b1b87bb62Mark Wei     * URI for account type specific supplementary account info on outgoing links, if any.
2009982fdb413d09b8e391dbc96a114987b1b87bb62Mark Wei     */
2019982fdb413d09b8e391dbc96a114987b1b87bb62Mark Wei    public final Uri viewIntentProxyUri;
2029982fdb413d09b8e391dbc96a114987b1b87bb62Mark Wei
2039982fdb413d09b8e391dbc96a114987b1b87bb62Mark Wei    /**
204b8361c9f8938b74977316319885998aae09aab77Paul Westbrook     * URI for querying for the account cookies to be used when displaying inline content in a
205b8361c9f8938b74977316319885998aae09aab77Paul Westbrook     * conversation
206b8361c9f8938b74977316319885998aae09aab77Paul Westbrook     */
207f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein    public final Uri accountCookieQueryUri;
208b8361c9f8938b74977316319885998aae09aab77Paul Westbrook
209b8361c9f8938b74977316319885998aae09aab77Paul Westbrook    /**
2100d0f8b061faae060529af4da339eed2d728ef1bdScott Kennedy     * URI to be used with an update() ContentResolver call with a {@link ContentValues} object
2110d0f8b061faae060529af4da339eed2d728ef1bdScott Kennedy     * where the keys are from the {@link AccountColumns.SettingsColumns}, and the values are the
2120d0f8b061faae060529af4da339eed2d728ef1bdScott Kennedy     * new values.
2130d0f8b061faae060529af4da339eed2d728ef1bdScott Kennedy     */
2140d0f8b061faae060529af4da339eed2d728ef1bdScott Kennedy    public final Uri updateSettingsUri;
2150d0f8b061faae060529af4da339eed2d728ef1bdScott Kennedy
2160d0f8b061faae060529af4da339eed2d728ef1bdScott Kennedy    /**
2173617b41394337774fb2e6fcf9fef1ac9eca00482Alice Yang     * Whether message transforms (HTML DOM manipulation) feature is enabled.
2183617b41394337774fb2e6fcf9fef1ac9eca00482Alice Yang     */
2193617b41394337774fb2e6fcf9fef1ac9eca00482Alice Yang    public final int enableMessageTransforms;
220c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang
221c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang    /**
222c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang     * Sync authority used by the mail app.  This can be used in
223c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang     * {@link ContentResolver#getSyncAutomatically} calls to check for whether sync is enabled
224c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang     * for this account and mail app.
225c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang     */
226c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang    public final String syncAuthority;
227c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang
22859e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler    public final Uri quickResponseUri;
22959e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler
2303617b41394337774fb2e6fcf9fef1ac9eca00482Alice Yang    /**
231e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler     * Fragment class name for account settings
232e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler     */
233e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    public final String settingsFragmentClass;
234e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
235e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    /**
236469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon     * Nonzero value indicates that this account is on a security hold.
237469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon     */
238469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon    public final int securityHold;
239469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon
240469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon    /**
241469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon     * Uri to launch the account security activity.
242469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon     */
243469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon    public final String accountSecurityUri;
244469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon
245469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon    /**
2461617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang     * Transient cache of parsed {@link #accountFromAddresses}, plus an entry for the main account
2471617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang     * address.
2481617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang     */
2491617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang    private transient List<ReplyFromAccount> mReplyFroms;
2501617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang
251b334c9035e9b7a38766bb66c29da2208525d1e11Paul Westbrook    private static final String LOG_TAG = LogTag.getLogTag();
2526dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal
25327e85f244604c8de53b76b135e0dd6f2bf3cad96Vikram Aggarwal    /**
2544b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen     * A custom {@coder Builder} class which client could override.
2554b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen     */
2564b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    private static Class<? extends Builder> sBuilderClass;
2574b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    private static Builder sBuilder;
2584b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen
2594b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    /**
260b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook     * Return a serialized String for this account.
261518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereira     */
2626dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal    public synchronized String serialize() {
2636dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal        JSONObject json = new JSONObject();
2646dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal        try {
26526a20758413f0f8629ea71a0943304e3ae740165Tony Mantler            json.put(AccountColumns.NAME, displayName);
26659e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.TYPE, type);
267bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler            json.put(AccountColumns.SENDER_NAME, senderName);
2683e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler            json.put(AccountColumns.ACCOUNT_MANAGER_NAME, accountManagerName);
269e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen            json.put(AccountColumns.ACCOUNT_ID, accountId);
27059e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.PROVIDER_VERSION, providerVersion);
27159e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.URI, uri);
27259e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.CAPABILITIES, capabilities);
27359e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.FOLDER_LIST_URI, folderListUri);
27459e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.FULL_FOLDER_LIST_URI, fullFolderListUri);
275009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler            json.put(AccountColumns.ALL_FOLDER_LIST_URI, allFolderListUri);
27659e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.SEARCH_URI, searchUri);
27759e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.ACCOUNT_FROM_ADDRESSES, accountFromAddresses);
27859e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.EXPUNGE_MESSAGE_URI, expungeMessageUri);
27959e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.UNDO_URI, undoUri);
28059e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.SETTINGS_INTENT_URI, settingsIntentUri);
28159e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.HELP_INTENT_URI, helpIntentUri);
28259e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.SEND_FEEDBACK_INTENT_URI, sendFeedbackIntentUri);
28359e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.REAUTHENTICATION_INTENT_URI, reauthenticationIntentUri);
28459e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.SYNC_STATUS, syncStatus);
28559e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.COMPOSE_URI, composeIntentUri);
28659e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.MIME_TYPE, mimeType);
28759e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.RECENT_FOLDER_LIST_URI, recentFolderListUri);
28859e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.COLOR, color);
28959e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.DEFAULT_RECENT_FOLDER_LIST_URI, defaultRecentFolderListUri);
29059e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.MANUAL_SYNC_URI, manualSyncUri);
29159e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.VIEW_INTENT_PROXY_URI, viewIntentProxyUri);
292f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein            json.put(AccountColumns.ACCOUNT_COOKIE_QUERY_URI, accountCookieQueryUri);
29359e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.UPDATE_SETTINGS_URI, updateSettingsUri);
29459e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.ENABLE_MESSAGE_TRANSFORMS, enableMessageTransforms);
29559e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.SYNC_AUTHORITY, syncAuthority);
29659e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler            json.put(AccountColumns.QUICK_RESPONSE_URI, quickResponseUri);
297e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            json.put(AccountColumns.SETTINGS_FRAGMENT_CLASS, settingsFragmentClass);
298469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon            json.put(AccountColumns.SECURITY_HOLD, securityHold);
299469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon            json.put(AccountColumns.ACCOUNT_SECURITY_URI, accountSecurityUri);
300b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook            if (settings != null) {
301b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook                json.put(SETTINGS_KEY, settings.toJSON());
302b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook            }
3036dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal        } catch (JSONException e) {
30426a20758413f0f8629ea71a0943304e3ae740165Tony Mantler            LogUtils.wtf(LOG_TAG, e, "Could not serialize account with name %s",
30526a20758413f0f8629ea71a0943304e3ae740165Tony Mantler                    displayName);
3066dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal        }
3076dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal        return json.toString();
3086dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal    }
309518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereira
3104b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    public static class Builder {
3114b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        public Account buildFrom(Cursor cursor) {
3124b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen            return new Account(cursor);
3134b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        }
3144b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen
3154b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        public Account buildFrom(JSONObject json) throws JSONException {
3164b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen            return new Account(json);
3174b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        }
3184b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen
3194b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        public Account buildFrom(Parcel in, ClassLoader loader) {
3204b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen            return new Account(in, loader);
3214b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        }
3224b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    }
3234b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen
3244b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    public static synchronized Builder builder() {
3254b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        if (sBuilderClass == null) {
3264b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen            sBuilderClass = Builder.class;
3274b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        }
3284b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        if (sBuilder == null) {
3294b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen            try {
3304b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen                sBuilder = sBuilderClass.newInstance();
3314b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen            } catch (InstantiationException | IllegalAccessException e) {
3324b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen                LogUtils.w(LogUtils.TAG, e, "Can't initialize account builder");
3334b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen                sBuilder = new Builder();
3344b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen            }
3354b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        }
3364b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        return sBuilder;
3374b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    }
3384b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen
3394b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    /**
3404b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen     * Overrides the default {@code Account.Builder}
3414b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen     */
3424b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    public static synchronized void setBuilderClass(Class<? extends Builder> builderClass) {
3434b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        Preconditions.checkState(sBuilderClass == null);
3444b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen        sBuilderClass = builderClass;
3454b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    }
3464b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen
347518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereira    /**
3486dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal     * Create a new instance of an Account object using a serialized instance created previously
3496dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal     * using {@link #serialize()}. This returns null if the serialized instance was invalid or does
3506dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal     * not represent a valid account object.
351518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereira     *
352a4836711cf7909575bfb25720232c22c201efd06Tony Mantler     * @param serializedAccount JSON encoded account object
353a4836711cf7909575bfb25720232c22c201efd06Tony Mantler     * @return Account object
354518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereira     */
35526a20758413f0f8629ea71a0943304e3ae740165Tony Mantler    public static Account newInstance(String serializedAccount) {
356b1b855b71e502459e1571444fb1a9f74883c8330Paul Westbrook        // The heavy lifting is done by Account(name, type, json). This method
3576dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal        // is a wrapper to check for errors and exceptions and return back a null in cases
3586dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal        // something breaks.
3596dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal        try {
360b1b855b71e502459e1571444fb1a9f74883c8330Paul Westbrook            final JSONObject json = new JSONObject(serializedAccount);
3614b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen            return builder().buildFrom(json);
3626dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal        } catch (JSONException e) {
3635ee9dc48884714e9005a1409e7002a0e04bad313mindyp            LogUtils.w(LOG_TAG, e, "Could not create an account from this input: \"%s\"",
364b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook                    serializedAccount);
3656dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal            return null;
3666dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal        }
3676dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal    }
368518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereira
369518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereira    /**
37026a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     * Construct a new Account instance from a previously serialized string.
3716dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal     *
3726dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal     * <p>
37326a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     * This is private. Public uses should go through the safe {@link #newInstance(String)} method.
3746dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal     * </p>
37526a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     * @param json {@link JSONObject} representing a valid account.
3766dde178687e85aaab9b3f8e9c124c3ab99b77d5aVikram Aggarwal     * @throws JSONException
377518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereira     */
3784b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    protected Account(JSONObject json) throws JSONException {
37926a20758413f0f8629ea71a0943304e3ae740165Tony Mantler        displayName = (String) json.get(UIProvider.AccountColumns.NAME);
38026a20758413f0f8629ea71a0943304e3ae740165Tony Mantler        type = (String) json.get(UIProvider.AccountColumns.TYPE);
381afe5e27521b98540a17ec352d16e3641fea8dfd6James Lemieux        senderName = json.optString(AccountColumns.SENDER_NAME, null);
382389c3347fcd11ffe7aa16782389613acf28f951cTony Mantler        final String amName = json.optString(AccountColumns.ACCOUNT_MANAGER_NAME);
3833e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        // We need accountManagerName to be filled in, but we might be dealing with an old cache
3843e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        // entry which doesn't have it, so use the display name instead in that case as a fallback
3853e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        if (TextUtils.isEmpty(amName)) {
38626a20758413f0f8629ea71a0943304e3ae740165Tony Mantler            accountManagerName = displayName;
3873e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        } else {
3883e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler            accountManagerName = amName;
3893e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        }
390468671839fc23e268ca5801d40bd973ddd515522Ray Chen        accountId = json.optString(UIProvider.AccountColumns.ACCOUNT_ID, accountManagerName);
391db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        providerVersion = json.getInt(AccountColumns.PROVIDER_VERSION);
392db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        uri = Uri.parse(json.optString(AccountColumns.URI));
393db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        capabilities = json.getInt(AccountColumns.CAPABILITIES);
394b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira        folderListUri = Utils
395db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang                .getValidUri(json.optString(AccountColumns.FOLDER_LIST_URI));
396b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira        fullFolderListUri = Utils.getValidUri(json
397db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang                .optString(AccountColumns.FULL_FOLDER_LIST_URI));
398009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler        allFolderListUri = Utils.getValidUri(json
399009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler                .optString(AccountColumns.ALL_FOLDER_LIST_URI));
400db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        searchUri = Utils.getValidUri(json.optString(AccountColumns.SEARCH_URI));
401df9731cce1cc8043f883b369a410c4dc765b8e7eGreg Bullock        accountFromAddresses = json.optString(AccountColumns.ACCOUNT_FROM_ADDRESSES, "");
402b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira        expungeMessageUri = Utils.getValidUri(json
403db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang                .optString(AccountColumns.EXPUNGE_MESSAGE_URI));
404db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        undoUri = Utils.getValidUri(json.optString(AccountColumns.UNDO_URI));
405b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira        settingsIntentUri = Utils.getValidUri(json
406db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang                .optString(AccountColumns.SETTINGS_INTENT_URI));
407db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        helpIntentUri = Utils.getValidUri(json.optString(AccountColumns.HELP_INTENT_URI));
408b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira        sendFeedbackIntentUri = Utils.getValidUri(json
409db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang                .optString(AccountColumns.SEND_FEEDBACK_INTENT_URI));
410122f7c2cf45cd5f07462a7b0a553f82828a8b1a2Paul Westbrook        reauthenticationIntentUri = Utils.getValidUri(
411db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang                json.optString(AccountColumns.REAUTHENTICATION_INTENT_URI));
412db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        syncStatus = json.optInt(AccountColumns.SYNC_STATUS);
413db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        composeIntentUri = Utils.getValidUri(json.optString(AccountColumns.COMPOSE_URI));
414db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        mimeType = json.optString(AccountColumns.MIME_TYPE);
415b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira        recentFolderListUri = Utils.getValidUri(json
416db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang                .optString(AccountColumns.RECENT_FOLDER_LIST_URI));
417db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        color = json.optInt(AccountColumns.COLOR, 0);
418b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira        defaultRecentFolderListUri = Utils.getValidUri(json
419db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang                .optString(AccountColumns.DEFAULT_RECENT_FOLDER_LIST_URI));
420b378d64bab3c7517794ad7e2aee1d06c074e99eeMindy Pereira        manualSyncUri = Utils
421db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang                .getValidUri(json.optString(AccountColumns.MANUAL_SYNC_URI));
4229982fdb413d09b8e391dbc96a114987b1b87bb62Mark Wei        viewIntentProxyUri = Utils
423db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang                .getValidUri(json.optString(AccountColumns.VIEW_INTENT_PROXY_URI));
424f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein        accountCookieQueryUri = Utils.getValidUri(
425db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang                json.optString(AccountColumns.ACCOUNT_COOKIE_QUERY_URI));
4260d0f8b061faae060529af4da339eed2d728ef1bdScott Kennedy        updateSettingsUri = Utils.getValidUri(
427db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang                json.optString(AccountColumns.UPDATE_SETTINGS_URI));
4283617b41394337774fb2e6fcf9fef1ac9eca00482Alice Yang        enableMessageTransforms = json.optInt(AccountColumns.ENABLE_MESSAGE_TRANSFORMS);
429c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang        syncAuthority = json.optString(AccountColumns.SYNC_AUTHORITY);
43059e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        quickResponseUri = Utils.getValidUri(json.optString(AccountColumns.QUICK_RESPONSE_URI));
431e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        settingsFragmentClass = json.optString(AccountColumns.SETTINGS_FRAGMENT_CLASS, "");
432469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon        securityHold = json.optInt(AccountColumns.SECURITY_HOLD);
433469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon        accountSecurityUri = json.optString(AccountColumns.ACCOUNT_SECURITY_URI);
434b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook
43519e5908550fa9aac54be1647462b06be0e724440Paul Westbrook        final Settings jsonSettings = Settings.newInstance(json.optJSONObject(SETTINGS_KEY));
43619e5908550fa9aac54be1647462b06be0e724440Paul Westbrook        if (jsonSettings != null) {
43719e5908550fa9aac54be1647462b06be0e724440Paul Westbrook            settings = jsonSettings;
43819e5908550fa9aac54be1647462b06be0e724440Paul Westbrook        } else {
43919e5908550fa9aac54be1647462b06be0e724440Paul Westbrook            LogUtils.e(LOG_TAG, new Throwable(),
44019e5908550fa9aac54be1647462b06be0e724440Paul Westbrook                    "Unexpected null settings in Account(name, type, jsonAccount)");
44119e5908550fa9aac54be1647462b06be0e724440Paul Westbrook            settings = Settings.EMPTY_SETTINGS;
44219e5908550fa9aac54be1647462b06be0e724440Paul Westbrook        }
443518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereira    }
444518ee42d4f5cfbcac07dc61fdcac4de8c32c0e26Mindy Pereira
4454b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    protected Account(Cursor cursor) {
44626a20758413f0f8629ea71a0943304e3ae740165Tony Mantler        displayName = cursor.getString(cursor.getColumnIndex(UIProvider.AccountColumns.NAME));
447bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler        senderName = cursor.getString(cursor.getColumnIndex(UIProvider.AccountColumns.SENDER_NAME));
4483e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        type = cursor.getString(cursor.getColumnIndex(UIProvider.AccountColumns.TYPE));
4493e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        accountManagerName = cursor.getString(
4503e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler                cursor.getColumnIndex(UIProvider.AccountColumns.ACCOUNT_MANAGER_NAME));
451e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen        accountId = cursor.getString(
452e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen                cursor.getColumnIndex(UIProvider.AccountColumns.ACCOUNT_ID));
453df9731cce1cc8043f883b369a410c4dc765b8e7eGreg Bullock        accountFromAddresses = Strings.nullToEmpty(cursor.getString(
454df9731cce1cc8043f883b369a410c4dc765b8e7eGreg Bullock                cursor.getColumnIndex(UIProvider.AccountColumns.ACCOUNT_FROM_ADDRESSES)));
455d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy
456d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        final int capabilitiesColumnIndex =
457d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getColumnIndex(UIProvider.AccountColumns.CAPABILITIES);
458d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        if (capabilitiesColumnIndex != -1) {
459d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy            capabilities = cursor.getInt(capabilitiesColumnIndex);
460d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        } else {
461d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy            capabilities = 0;
462d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        }
463d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy
464d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        providerVersion =
465d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getInt(cursor.getColumnIndex(UIProvider.AccountColumns.PROVIDER_VERSION));
466d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        uri = Uri.parse(cursor.getString(cursor.getColumnIndex(UIProvider.AccountColumns.URI)));
467d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        folderListUri = Uri.parse(
468d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getString(cursor.getColumnIndex(UIProvider.AccountColumns.FOLDER_LIST_URI)));
469d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        fullFolderListUri = Utils.getValidUri(cursor.getString(
470d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getColumnIndex(UIProvider.AccountColumns.FULL_FOLDER_LIST_URI)));
471009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler        allFolderListUri = Utils.getValidUri(cursor.getString(
472009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler                cursor.getColumnIndex(UIProvider.AccountColumns.ALL_FOLDER_LIST_URI)));
473d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        searchUri = Utils.getValidUri(
474d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getString(cursor.getColumnIndex(UIProvider.AccountColumns.SEARCH_URI)));
475d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        expungeMessageUri = Utils.getValidUri(cursor.getString(
476d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getColumnIndex(UIProvider.AccountColumns.EXPUNGE_MESSAGE_URI)));
477d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        undoUri = Utils.getValidUri(
478d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getString(cursor.getColumnIndex(UIProvider.AccountColumns.UNDO_URI)));
479d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        settingsIntentUri = Utils.getValidUri(cursor.getString(
480d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getColumnIndex(UIProvider.AccountColumns.SETTINGS_INTENT_URI)));
481d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        helpIntentUri = Utils.getValidUri(
482d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getString(cursor.getColumnIndex(UIProvider.AccountColumns.HELP_INTENT_URI)));
483d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        sendFeedbackIntentUri = Utils.getValidUri(cursor.getString(
484d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getColumnIndex(UIProvider.AccountColumns.SEND_FEEDBACK_INTENT_URI)));
485d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        reauthenticationIntentUri = Utils.getValidUri(cursor.getString(
486d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getColumnIndex(UIProvider.AccountColumns.REAUTHENTICATION_INTENT_URI)));
487d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        syncStatus = cursor.getInt(cursor.getColumnIndex(UIProvider.AccountColumns.SYNC_STATUS));
488d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        composeIntentUri = Utils.getValidUri(
489d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getString(cursor.getColumnIndex(UIProvider.AccountColumns.COMPOSE_URI)));
490d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        mimeType = cursor.getString(cursor.getColumnIndex(UIProvider.AccountColumns.MIME_TYPE));
491d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        recentFolderListUri = Utils.getValidUri(cursor.getString(
492d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getColumnIndex(UIProvider.AccountColumns.RECENT_FOLDER_LIST_URI)));
493d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        color = cursor.getInt(cursor.getColumnIndex(UIProvider.AccountColumns.COLOR));
494d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        defaultRecentFolderListUri = Utils.getValidUri(cursor.getString(
495d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getColumnIndex(UIProvider.AccountColumns.DEFAULT_RECENT_FOLDER_LIST_URI)));
496d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        manualSyncUri = Utils.getValidUri(
497d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getString(cursor.getColumnIndex(UIProvider.AccountColumns.MANUAL_SYNC_URI)));
498d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        viewIntentProxyUri = Utils.getValidUri(cursor.getString(
499d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getColumnIndex(UIProvider.AccountColumns.VIEW_INTENT_PROXY_URI)));
500f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein        accountCookieQueryUri = Utils.getValidUri(cursor.getString(
501d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getColumnIndex(UIProvider.AccountColumns.ACCOUNT_COOKIE_QUERY_URI)));
502d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        updateSettingsUri = Utils.getValidUri(cursor.getString(
503d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                cursor.getColumnIndex(UIProvider.AccountColumns.UPDATE_SETTINGS_URI)));
5043617b41394337774fb2e6fcf9fef1ac9eca00482Alice Yang        enableMessageTransforms = cursor.getInt(
5053617b41394337774fb2e6fcf9fef1ac9eca00482Alice Yang                cursor.getColumnIndex(AccountColumns.ENABLE_MESSAGE_TRANSFORMS));
506c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang        syncAuthority = cursor.getString(
507c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang                cursor.getColumnIndex(AccountColumns.SYNC_AUTHORITY));
508db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        if (TextUtils.isEmpty(syncAuthority)) {
509145fed433ce06d350d83eee25f2a2e6d39ab2facTony Mantler            // NOTE: this is actually expected in Email for the "combined view" account only
510db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang            LogUtils.e(LOG_TAG, "Unexpected empty syncAuthority from cursor");
511db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        }
51259e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        quickResponseUri = Utils.getValidUri(cursor.getString(
51359e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler                cursor.getColumnIndex(AccountColumns.QUICK_RESPONSE_URI)));
514e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        settingsFragmentClass = cursor.getString(cursor.getColumnIndex(
515e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                AccountColumns.SETTINGS_FRAGMENT_CLASS));
516469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon        final int securityHoldIndex = cursor.getColumnIndex(AccountColumns.SECURITY_HOLD);
517469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon        securityHold = (securityHoldIndex >= 0 ?
518469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon                cursor.getInt(cursor.getColumnIndex(AccountColumns.SECURITY_HOLD)) : 0);
519469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon        final int accountSecurityIndex =
520469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon                cursor.getColumnIndex(AccountColumns.ACCOUNT_SECURITY_URI);
521469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon        accountSecurityUri = (accountSecurityIndex >= 0 ?
522469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon                cursor.getString(accountSecurityIndex) : "");
523b1f573c59ec20f9149443e1e0cc8b64ff3a07feaPaul Westbrook        settings = new Settings(cursor);
52433fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira    }
52533fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira
526a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal    /**
527aa8d291fea7b25c5d19ba2974a2b1a6d1b71dd8cVikram Aggarwal     * Returns an array of all Accounts located at this cursor. This method returns a zero length
528aa8d291fea7b25c5d19ba2974a2b1a6d1b71dd8cVikram Aggarwal     * array if no account was found.  This method does not close the cursor.
529a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal     * @param cursor cursor pointing to the list of accounts
530a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal     * @return the array of all accounts stored at this cursor.
531a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal     */
532177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal    public static Account[] getAllAccounts(ObjectCursor<Account> cursor) {
533a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal        final int initialLength = cursor.getCount();
534a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal        if (initialLength <= 0 || !cursor.moveToFirst()) {
535a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal            // Return zero length account array rather than null
536a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal            return new Account[0];
537a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal        }
538a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal
539636c1a1bf144e28a8a1ab022dfcfba83c7b1ca1bVikram Aggarwal        final Account[] allAccounts = new Account[initialLength];
540aa8d291fea7b25c5d19ba2974a2b1a6d1b71dd8cVikram Aggarwal        int i = 0;
541aa8d291fea7b25c5d19ba2974a2b1a6d1b71dd8cVikram Aggarwal        do {
542177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal            allAccounts[i++] = cursor.getModel();
543aa8d291fea7b25c5d19ba2974a2b1a6d1b71dd8cVikram Aggarwal        } while (cursor.moveToNext());
544aa8d291fea7b25c5d19ba2974a2b1a6d1b71dd8cVikram Aggarwal        // Ensure that the length of the array is accurate
545aa8d291fea7b25c5d19ba2974a2b1a6d1b71dd8cVikram Aggarwal        assert (i == initialLength);
546a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal        return allAccounts;
547a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal    }
548a9b93f35035dc4badd0ac40f4016e1ff809b26b0Vikram Aggarwal
5493e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler    public android.accounts.Account getAccountManagerAccount() {
550b90a813b107d8f43236e2d3fe12f299d94c82ce8Tony Mantler        if (amAccount == null) {
551b90a813b107d8f43236e2d3fe12f299d94c82ce8Tony Mantler            // We don't really need to synchronize this
552b90a813b107d8f43236e2d3fe12f299d94c82ce8Tony Mantler            // as worst case is we'd create an extra identical object and throw it away
553b90a813b107d8f43236e2d3fe12f299d94c82ce8Tony Mantler            amAccount = new android.accounts.Account(accountManagerName, type);
554b90a813b107d8f43236e2d3fe12f299d94c82ce8Tony Mantler        }
555b90a813b107d8f43236e2d3fe12f299d94c82ce8Tony Mantler        return amAccount;
5563e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler    }
5573e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler
558d92e9f3d45cfedd3ebfedcf0805283007053e091Mindy Pereira    public boolean supportsCapability(int capability) {
559d92e9f3d45cfedd3ebfedcf0805283007053e091Mindy Pereira        return (capabilities & capability) != 0;
560846488982a7a93f48ec36b616657fad10c62d8f5Mindy Pereira    }
561846488982a7a93f48ec36b616657fad10c62d8f5Mindy Pereira
5623531d7ee9b36c9f9dd909be79ab899dd60cd71aeJames Lemieux    /**
5633531d7ee9b36c9f9dd909be79ab899dd60cd71aeJames Lemieux     * @return <tt>true</tt> if this mail account can be searched in any way (locally on the device,
5643531d7ee9b36c9f9dd909be79ab899dd60cd71aeJames Lemieux     *      remotely on the server, or remotely on the server within the current folder)
5653531d7ee9b36c9f9dd909be79ab899dd60cd71aeJames Lemieux     */
5663531d7ee9b36c9f9dd909be79ab899dd60cd71aeJames Lemieux    public boolean supportsSearch() {
5673531d7ee9b36c9f9dd909be79ab899dd60cd71aeJames Lemieux        return supportsCapability(AccountCapabilities.LOCAL_SEARCH)
5683531d7ee9b36c9f9dd909be79ab899dd60cd71aeJames Lemieux                || supportsCapability(AccountCapabilities.SERVER_SEARCH)
5693531d7ee9b36c9f9dd909be79ab899dd60cd71aeJames Lemieux                || supportsCapability(AccountCapabilities.FOLDER_SERVER_SEARCH);
5703531d7ee9b36c9f9dd909be79ab899dd60cd71aeJames Lemieux    }
5713531d7ee9b36c9f9dd909be79ab899dd60cd71aeJames Lemieux
572dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook    public boolean isAccountSyncRequired() {
573dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook        return (syncStatus & SyncStatus.INITIAL_SYNC_NEEDED) == SyncStatus.INITIAL_SYNC_NEEDED;
574dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook    }
575dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook
576dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook    public boolean isAccountInitializationRequired() {
577dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook        return (syncStatus & SyncStatus.ACCOUNT_INITIALIZATION_REQUIRED) ==
578dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook                SyncStatus.ACCOUNT_INITIALIZATION_REQUIRED;
579dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook    }
580dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook
581dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook    /**
582dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook     * Returns true when when the UI provider has indicated that the account has been initialized,
583dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook     * and sync is not required.
584dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook     */
585dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook    public boolean isAccountReady() {
586dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook        return !isAccountInitializationRequired() && !isAccountSyncRequired();
5872d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook    }
5882d50bcdca57756ecad20d21da0d936243215b79cPaul Westbrook
5892168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps    /**
5902168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps     * @return The account manager account type.
5912168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps     */
5922168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps    public String getType() {
5932168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps        return type;
5942168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps    }
5952168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps
5964b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen    protected Account(Parcel in, ClassLoader loader) {
59726a20758413f0f8629ea71a0943304e3ae740165Tony Mantler        displayName = in.readString();
598bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler        senderName = in.readString();
5993e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        type = in.readString();
6003e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        accountManagerName = in.readString();
601db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        providerVersion = in.readInt();
602db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        uri = in.readParcelable(null);
603db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        capabilities = in.readInt();
604db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        folderListUri = in.readParcelable(null);
605db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        fullFolderListUri = in.readParcelable(null);
606009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler        allFolderListUri = in.readParcelable(null);
607db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        searchUri = in.readParcelable(null);
608db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        accountFromAddresses = in.readString();
609db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        expungeMessageUri = in.readParcelable(null);
610db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        undoUri = in.readParcelable(null);
611db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        settingsIntentUri = in.readParcelable(null);
612db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        helpIntentUri = in.readParcelable(null);
613db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        sendFeedbackIntentUri = in.readParcelable(null);
614db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        reauthenticationIntentUri = in.readParcelable(null);
615db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        syncStatus = in.readInt();
616db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        composeIntentUri = in.readParcelable(null);
617db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        mimeType = in.readString();
618db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        recentFolderListUri = in.readParcelable(null);
619db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        color = in.readInt();
620db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        defaultRecentFolderListUri = in.readParcelable(null);
621db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        manualSyncUri = in.readParcelable(null);
622db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        viewIntentProxyUri = in.readParcelable(null);
623f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein        accountCookieQueryUri = in.readParcelable(null);
624db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        updateSettingsUri = in.readParcelable(null);
625db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        enableMessageTransforms = in.readInt();
626db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        syncAuthority = in.readString();
627db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        if (TextUtils.isEmpty(syncAuthority)) {
628db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang            LogUtils.e(LOG_TAG, "Unexpected empty syncAuthority from Parcel");
629db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        }
630db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        quickResponseUri = in.readParcelable(null);
631e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        settingsFragmentClass = in.readString();
632469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon        securityHold = in.readInt();
633469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon        accountSecurityUri = in.readString();
634db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        final int hasSettings = in.readInt();
635db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        if (hasSettings == 0) {
636db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang            LogUtils.e(LOG_TAG, new Throwable(), "Unexpected null settings in Account(Parcel)");
637db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang            settings = Settings.EMPTY_SETTINGS;
638db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        } else {
639db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang            settings = in.readParcelable(loader);
640db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang        }
641e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen        accountId = in.readString();
642db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang    }
643db77b36aa9bdda2ebadccc4188715563a95f9bf0Alice Yang
644732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @Override
64533fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira    public void writeToParcel(Parcel dest, int flags) {
64626a20758413f0f8629ea71a0943304e3ae740165Tony Mantler        dest.writeString(displayName);
647bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler        dest.writeString(senderName);
6483e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        dest.writeString(type);
6493e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        dest.writeString(accountManagerName);
65033fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira        dest.writeInt(providerVersion);
651cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(uri, 0);
65233fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira        dest.writeInt(capabilities);
653cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(folderListUri, 0);
65431d7967c857d7486f27329135dffb3a2977b54e2Mindy Pereira        dest.writeParcelable(fullFolderListUri, 0);
655009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler        dest.writeParcelable(allFolderListUri, 0);
656cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(searchUri, 0);
65792551d057965689f1952faeb06763f0762bc717fMindy Pereira        dest.writeString(accountFromAddresses);
658cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(expungeMessageUri, 0);
659cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(undoUri, 0);
660dac00547ce8d44a964e4510315168ee413e55a75Mindy Pereira        dest.writeParcelable(settingsIntentUri, 0);
661cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(helpIntentUri, 0);
662517743ef4e3e4ac103a3c096b9e3c894da7ed87aPaul Westbrook        dest.writeParcelable(sendFeedbackIntentUri, 0);
663122f7c2cf45cd5f07462a7b0a553f82828a8b1a2Paul Westbrook        dest.writeParcelable(reauthenticationIntentUri, 0);
6649ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank        dest.writeInt(syncStatus);
665cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira        dest.writeParcelable(composeIntentUri, 0);
666898cd38018ff4331e79262451f464efa9dc5d43eMindy Pereira        dest.writeString(mimeType);
66727e85f244604c8de53b76b135e0dd6f2bf3cad96Vikram Aggarwal        dest.writeParcelable(recentFolderListUri, 0);
668b287833c2645e2502792821e54d7226cfad59955Marc Blank        dest.writeInt(color);
66927d89ada3e8d1b17357a7064e1f47f3c15686412Vikram Aggarwal        dest.writeParcelable(defaultRecentFolderListUri, 0);
670b971a8fcc31e54c645c5a096bf75077d6e1bc5baMindy Pereira        dest.writeParcelable(manualSyncUri, 0);
6719982fdb413d09b8e391dbc96a114987b1b87bb62Mark Wei        dest.writeParcelable(viewIntentProxyUri, 0);
672f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein        dest.writeParcelable(accountCookieQueryUri, 0);
6730d0f8b061faae060529af4da339eed2d728ef1bdScott Kennedy        dest.writeParcelable(updateSettingsUri, 0);
6743617b41394337774fb2e6fcf9fef1ac9eca00482Alice Yang        dest.writeInt(enableMessageTransforms);
675c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang        dest.writeString(syncAuthority);
67659e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        dest.writeParcelable(quickResponseUri, 0);
677e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        dest.writeString(settingsFragmentClass);
678469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon        dest.writeInt(securityHold);
679469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon        dest.writeString(accountSecurityUri);
68019e5908550fa9aac54be1647462b06be0e724440Paul Westbrook        if (settings == null) {
68119e5908550fa9aac54be1647462b06be0e724440Paul Westbrook            LogUtils.e(LOG_TAG, "unexpected null settings object in writeToParcel");
682a4836711cf7909575bfb25720232c22c201efd06Tony Mantler            dest.writeInt(0);
683a4836711cf7909575bfb25720232c22c201efd06Tony Mantler        } else {
684a4836711cf7909575bfb25720232c22c201efd06Tony Mantler            dest.writeInt(1);
685a4836711cf7909575bfb25720232c22c201efd06Tony Mantler            dest.writeParcelable(settings, 0);
68619e5908550fa9aac54be1647462b06be0e724440Paul Westbrook        }
687e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen        dest.writeString(accountId);
6888a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira    }
6898a8c50d8fcc4f20549c9f395edbad017a940e72bMindy Pereira
690db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook    @Override
6913e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler    public int describeContents() {
6923e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        return 0;
6933e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler    }
6943e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler
6953e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler    @Override
696db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook    public String toString() {
6970ad577a90cbdc7d12cd18ef11a713bb7e38e58bfTony Mantler        // JSON is readable enough.
6980ad577a90cbdc7d12cd18ef11a713bb7e38e58bfTony Mantler        return serialize();
699db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook    }
700db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook
701db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook    @Override
702db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook    public boolean equals(Object o) {
703db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook        if (o == this) {
704db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook            return true;
705db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook        }
706db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook
707db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook        if ((o == null) || (o.getClass() != this.getClass())) {
708db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook            return false;
709db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook        }
710db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook
711db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook        final Account other = (Account) o;
71226a20758413f0f8629ea71a0943304e3ae740165Tony Mantler        return TextUtils.equals(displayName, other.displayName) &&
713bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler                TextUtils.equals(senderName, other.senderName) &&
7144180c45904eca7b53f70ea6ca2ab241910bc9a2cTony Mantler                TextUtils.equals(accountManagerName, other.accountManagerName) &&
715e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen                TextUtils.equals(accountId, other.accountId) &&
7164180c45904eca7b53f70ea6ca2ab241910bc9a2cTony Mantler                TextUtils.equals(type, other.type) &&
7174180c45904eca7b53f70ea6ca2ab241910bc9a2cTony Mantler                capabilities == other.capabilities &&
7184180c45904eca7b53f70ea6ca2ab241910bc9a2cTony Mantler                providerVersion == other.providerVersion &&
719db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook                Objects.equal(uri, other.uri) &&
720db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook                Objects.equal(folderListUri, other.folderListUri) &&
72131d7967c857d7486f27329135dffb3a2977b54e2Mindy Pereira                Objects.equal(fullFolderListUri, other.fullFolderListUri) &&
722009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler                Objects.equal(allFolderListUri, other.allFolderListUri) &&
723db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook                Objects.equal(searchUri, other.searchUri) &&
72492551d057965689f1952faeb06763f0762bc717fMindy Pereira                Objects.equal(accountFromAddresses, other.accountFromAddresses) &&
725db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook                Objects.equal(expungeMessageUri, other.expungeMessageUri) &&
726db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook                Objects.equal(undoUri, other.undoUri) &&
727db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook                Objects.equal(settingsIntentUri, other.settingsIntentUri) &&
728db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook                Objects.equal(helpIntentUri, other.helpIntentUri) &&
729517743ef4e3e4ac103a3c096b9e3c894da7ed87aPaul Westbrook                Objects.equal(sendFeedbackIntentUri, other.sendFeedbackIntentUri) &&
730122f7c2cf45cd5f07462a7b0a553f82828a8b1a2Paul Westbrook                Objects.equal(reauthenticationIntentUri, other.reauthenticationIntentUri) &&
731db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook                (syncStatus == other.syncStatus) &&
732898cd38018ff4331e79262451f464efa9dc5d43eMindy Pereira                Objects.equal(composeIntentUri, other.composeIntentUri) &&
73327e85f244604c8de53b76b135e0dd6f2bf3cad96Vikram Aggarwal                TextUtils.equals(mimeType, other.mimeType) &&
734b287833c2645e2502792821e54d7226cfad59955Marc Blank                Objects.equal(recentFolderListUri, other.recentFolderListUri) &&
73527d89ada3e8d1b17357a7064e1f47f3c15686412Vikram Aggarwal                color == other.color &&
7366006991395131d7d1db4f883ff8c7a87498b6eecVikram Aggarwal                Objects.equal(defaultRecentFolderListUri, other.defaultRecentFolderListUri) &&
7379982fdb413d09b8e391dbc96a114987b1b87bb62Mark Wei                Objects.equal(viewIntentProxyUri, other.viewIntentProxyUri) &&
738f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein                Objects.equal(accountCookieQueryUri, other.accountCookieQueryUri) &&
7390d0f8b061faae060529af4da339eed2d728ef1bdScott Kennedy                Objects.equal(updateSettingsUri, other.updateSettingsUri) &&
7403617b41394337774fb2e6fcf9fef1ac9eca00482Alice Yang                Objects.equal(enableMessageTransforms, other.enableMessageTransforms) &&
741c86b1fbcea43513ea903bb2ca14573423a72d7b5Alice Yang                Objects.equal(syncAuthority, other.syncAuthority) &&
74259e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler                Objects.equal(quickResponseUri, other.quickResponseUri) &&
743e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                Objects.equal(settingsFragmentClass, other.settingsFragmentClass) &&
744469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon                Objects.equal(securityHold, other.securityHold) &&
745469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon                Objects.equal(accountSecurityUri, other.accountSecurityUri) &&
7466006991395131d7d1db4f883ff8c7a87498b6eecVikram Aggarwal                Objects.equal(settings, other.settings);
747db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook    }
748db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook
749e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal    /**
750e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal     * Returns true if the two accounts differ in sync or server-side settings.
751e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal     * This is <b>not</b> a replacement for {@link #equals(Object)}.
752a4836711cf7909575bfb25720232c22c201efd06Tony Mantler     * @param other Account object to compare
753a4836711cf7909575bfb25720232c22c201efd06Tony Mantler     * @return true if the two accounts differ in sync or server-side settings
754e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal     */
755e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal    public final boolean settingsDiffer(Account other) {
756e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal        // If the other object doesn't exist, they differ significantly.
757e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal        if (other == null) {
758e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal            return true;
759e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal        }
760e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal        // Check all the server-side settings, the user-side settings and the sync status.
761e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal        return ((this.syncStatus != other.syncStatus)
762e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal                || !Objects.equal(accountFromAddresses, other.accountFromAddresses)
763e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal                || color != other.color
764e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal                || (this.settings.hashCode() != other.settings.hashCode()));
765e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal    }
766e0afef979657256a2014024babe51d099e254a57Vikram Aggarwal
767db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook    @Override
768db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook    public int hashCode() {
76926a20758413f0f8629ea71a0943304e3ae740165Tony Mantler        return Objects.hashCode(displayName,
770bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler                senderName,
771154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                accountManagerName,
772154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                type,
773154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                capabilities,
774154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                providerVersion,
775154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                uri,
776154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                folderListUri,
777154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                fullFolderListUri,
778154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                allFolderListUri,
779154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                searchUri,
780154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                accountFromAddresses,
781154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                expungeMessageUri,
782154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                undoUri,
783154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                settingsIntentUri,
784154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                helpIntentUri,
785154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                sendFeedbackIntentUri,
786154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                reauthenticationIntentUri,
787154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                syncStatus,
788154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                composeIntentUri,
789154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                mimeType,
790154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                recentFolderListUri,
791154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                color,
792154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                defaultRecentFolderListUri,
793154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                viewIntentProxyUri,
794f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein                accountCookieQueryUri,
795154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                updateSettingsUri,
796154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                enableMessageTransforms,
797154d8cff5c56a0c4c2bf1cbabe42157bc482ac99Tony Mantler                syncAuthority,
798469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon                quickResponseUri,
799469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon                securityHold,
800469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon                accountSecurityUri);
801db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook    }
802db8f2f9ad5dcb1d52c399520129d89b1ca38f423Paul Westbrook
803b373e3ec0e488914635345627f5734af0f0ef76bAndy Huang    /**
804b373e3ec0e488914635345627f5734af0f0ef76bAndy Huang     * Returns whether two Accounts match, as determined by their base URIs.
805b373e3ec0e488914635345627f5734af0f0ef76bAndy Huang     * <p>For a deep object comparison, use {@link #equals(Object)}.
806b373e3ec0e488914635345627f5734af0f0ef76bAndy Huang     *
807b373e3ec0e488914635345627f5734af0f0ef76bAndy Huang     */
808b373e3ec0e488914635345627f5734af0f0ef76bAndy Huang    public boolean matches(Account other) {
809b373e3ec0e488914635345627f5734af0f0ef76bAndy Huang        return other != null && Objects.equal(uri, other.uri);
810b373e3ec0e488914635345627f5734af0f0ef76bAndy Huang    }
811b373e3ec0e488914635345627f5734af0f0ef76bAndy Huang
8121617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang    public List<ReplyFromAccount> getReplyFroms() {
8131617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang
8141617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang        if (mReplyFroms == null) {
8151617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang            mReplyFroms = Lists.newArrayList();
8161617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang
8171617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang            // skip if sending is unsupported
8188b85a9b88244bd910d63a7a0f594f3792b157aa0Tony Mantler            if (supportsCapability(AccountCapabilities.VIRTUAL_ACCOUNT)) {
8191617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                return mReplyFroms;
8201617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang            }
8211617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang
8221617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang            // add the main account address
823f441d149b334648917c551137a6b4fffdeb83b84Tony Mantler            mReplyFroms.add(new ReplyFromAccount(this, uri, getEmailAddress(), getSenderName(),
82479b1156803585952a4851221dc9fa9974e606433Tony Mantler                    getEmailAddress(), false /* isDefault */, false /* isCustom */));
8251617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang
8261617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang            if (!TextUtils.isEmpty(accountFromAddresses)) {
8271617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                try {
8281617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                    JSONArray accounts = new JSONArray(accountFromAddresses);
8291617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang
8301617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                    for (int i = 0, len = accounts.length(); i < len; i++) {
8311617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                        final ReplyFromAccount a = ReplyFromAccount.deserialize(this,
8321617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                                accounts.getJSONObject(i));
8331617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                        if (a != null) {
8341617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                            mReplyFroms.add(a);
8351617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                        }
8361617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                    }
8371617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang
8381617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                } catch (JSONException e) {
83926a20758413f0f8629ea71a0943304e3ae740165Tony Mantler                    LogUtils.e(LOG_TAG, e, "Unable to parse accountFromAddresses. name=%s",
84026a20758413f0f8629ea71a0943304e3ae740165Tony Mantler                            displayName);
8411617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                }
8421617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang            }
8431617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang        }
8441617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang        return mReplyFroms;
8451617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang    }
8461617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang
8471617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang    /**
8481617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang     * @param fromAddress a raw email address, e.g. "user@domain.com"
8491617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang     * @return if the address belongs to this Account (either as the main address or as a
8501617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang     * custom-from)
8511617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang     */
8521617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang    public boolean ownsFromAddress(String fromAddress) {
8531617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang        for (ReplyFromAccount replyFrom : getReplyFroms()) {
8541617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang            if (TextUtils.equals(replyFrom.address, fromAddress)) {
8551617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang                return true;
8561617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang            }
8571617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang        }
8581617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang
8591617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang        return false;
8601617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang    }
8611617481de7c1f9b8dfcd25ba9828e933cf9d5490Andy Huang
86226a20758413f0f8629ea71a0943304e3ae740165Tony Mantler    /**
86326a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     * The display name of the account is the alias the user has chosen to rename the account to.
86426a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     * By default it is the email address of the account, but could also be user-entered values like
86526a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     * "Work Account" or "Old ISP POP3 account".
86626a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     *
86726a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     * Account renaming only applies to Email, so a Gmail account should always return the primary
86826a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     * email address of the account.
86926a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     *
87026a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     * @return Account display name
87126a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     */
87226a20758413f0f8629ea71a0943304e3ae740165Tony Mantler    public String getDisplayName() {
87326a20758413f0f8629ea71a0943304e3ae740165Tony Mantler        return displayName;
87426a20758413f0f8629ea71a0943304e3ae740165Tony Mantler    }
87526a20758413f0f8629ea71a0943304e3ae740165Tony Mantler
87626a20758413f0f8629ea71a0943304e3ae740165Tony Mantler    /**
87726a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     * The primary email address associated with this account, which is also used as the account
87826a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     * manager account name.
87926a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     * @return email address
88026a20758413f0f8629ea71a0943304e3ae740165Tony Mantler     */
88179b1156803585952a4851221dc9fa9974e606433Tony Mantler    public String getEmailAddress() {
88279b1156803585952a4851221dc9fa9974e606433Tony Mantler        return accountManagerName;
88379b1156803585952a4851221dc9fa9974e606433Tony Mantler    }
88479b1156803585952a4851221dc9fa9974e606433Tony Mantler
885bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler    /**
886b2de799bb2fe36a83b95dad87e8909caa843a1c7Ray Chen     * The account id is an unique id to represent this account.
887b2de799bb2fe36a83b95dad87e8909caa843a1c7Ray Chen     */
888fd79237327f6803675cad2a64a74411ebda854e3Paul Westbrook    public String getAccountId() {
889e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen        LogUtils.d(LogUtils.TAG, "getAccountId = %s for email %s", accountId, accountManagerName);
890e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen        return accountId;
891b2de799bb2fe36a83b95dad87e8909caa843a1c7Ray Chen    }
892b2de799bb2fe36a83b95dad87e8909caa843a1c7Ray Chen
893b2de799bb2fe36a83b95dad87e8909caa843a1c7Ray Chen    /**
894bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler     * Returns the real name associated with the account, e.g. "John Doe" or null if no such name
895bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler     * has been configured
896bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler     * @return sender name
897bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler     */
898bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler    public String getSenderName() {
899bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler        return senderName;
900bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler    }
901bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler
902732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang    @SuppressWarnings("hiding")
9034473e8c92946914fbb7e86490ec32f481744c7afTony Mantler    public static final ClassLoaderCreator<Account> CREATOR = new ClassLoaderCreator<Account>() {
904732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        @Override
9054473e8c92946914fbb7e86490ec32f481744c7afTony Mantler        public Account createFromParcel(Parcel source, ClassLoader loader) {
9064b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen            return builder().buildFrom(source, loader);
9074473e8c92946914fbb7e86490ec32f481744c7afTony Mantler        }
9084473e8c92946914fbb7e86490ec32f481744c7afTony Mantler
9094473e8c92946914fbb7e86490ec32f481744c7afTony Mantler        @Override
9104473e8c92946914fbb7e86490ec32f481744c7afTony Mantler        public Account createFromParcel(Parcel source) {
9114b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen            return builder().buildFrom(source, null);
91233fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira        }
91333fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira
914732600e38891db139bae02dc91dd0c5b0987e8e9Andy Huang        @Override
91533fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira        public Account[] newArray(int size) {
91633fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira            return new Account[size];
91733fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira        }
91833fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira    };
91973bffaf3f72db506de249d432fe1442af38c1e13Vikram Aggarwal
92073bffaf3f72db506de249d432fe1442af38c1e13Vikram Aggarwal    /**
921d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy     * Creates a {@link Map} where the column name is the key and the value is the value, which can
922d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy     * be used for populating a {@link MatrixCursor}.
923d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy     */
924a4836711cf7909575bfb25720232c22c201efd06Tony Mantler    public Map<String, Object> getValueMap() {
925d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        // ImmutableMap.Builder does not allow null values
926d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        final Map<String, Object> map = new HashMap<String, Object>();
927d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy
92859e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns._ID, 0);
92926a20758413f0f8629ea71a0943304e3ae740165Tony Mantler        map.put(AccountColumns.NAME, displayName);
930bb036ff794f022bba2f501e155ef9c412e0e452eTony Mantler        map.put(AccountColumns.SENDER_NAME, senderName);
93159e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.TYPE, type);
9323e16687b074895bc6cc63a1ed93abf7033586fd2Tony Mantler        map.put(AccountColumns.ACCOUNT_MANAGER_NAME, accountManagerName);
933e2c633c9286f7fd571f8a2f507d2c6d002cb8ae1Ray Chen        map.put(AccountColumns.ACCOUNT_ID, accountId);
93459e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.PROVIDER_VERSION, providerVersion);
93559e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.URI, uri);
93659e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.CAPABILITIES, capabilities);
93759e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.FOLDER_LIST_URI, folderListUri);
93859e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.FULL_FOLDER_LIST_URI, fullFolderListUri);
939009f1b55b555638fd7276f8b996243a5d4ba7681Tony Mantler        map.put(AccountColumns.ALL_FOLDER_LIST_URI, allFolderListUri);
94059e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.SEARCH_URI, searchUri);
94159e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.ACCOUNT_FROM_ADDRESSES, accountFromAddresses);
94259e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.EXPUNGE_MESSAGE_URI, expungeMessageUri);
94359e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.UNDO_URI, undoUri);
94459e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.SETTINGS_INTENT_URI, settingsIntentUri);
94559e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.HELP_INTENT_URI, helpIntentUri);
94659e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.SEND_FEEDBACK_INTENT_URI, sendFeedbackIntentUri);
94759e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.REAUTHENTICATION_INTENT_URI, reauthenticationIntentUri);
94859e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.SYNC_STATUS, syncStatus);
94959e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.COMPOSE_URI, composeIntentUri);
95059e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.MIME_TYPE, mimeType);
95159e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.RECENT_FOLDER_LIST_URI, recentFolderListUri);
95259e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.DEFAULT_RECENT_FOLDER_LIST_URI, defaultRecentFolderListUri);
95359e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.MANUAL_SYNC_URI, manualSyncUri);
95459e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.VIEW_INTENT_PROXY_URI, viewIntentProxyUri);
955f59d01c3116dc2adde97a5b52aa6094144c2d315Andrew Sapperstein        map.put(AccountColumns.ACCOUNT_COOKIE_QUERY_URI, accountCookieQueryUri);
95659e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.COLOR, color);
95759e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.UPDATE_SETTINGS_URI, updateSettingsUri);
95859e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.ENABLE_MESSAGE_TRANSFORMS, enableMessageTransforms);
95959e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.SYNC_AUTHORITY, syncAuthority);
96059e69095bd558a1e6ae890ce79b7b848331d0cc6Tony Mantler        map.put(AccountColumns.QUICK_RESPONSE_URI, quickResponseUri);
961e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        map.put(AccountColumns.SETTINGS_FRAGMENT_CLASS, settingsFragmentClass);
962469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon        map.put(AccountColumns.SECURITY_HOLD, securityHold);
963469817c69011b108f953ada64bf10eaf7dd31341Martin Hibdon        map.put(AccountColumns.ACCOUNT_SECURITY_URI, accountSecurityUri);
964a4836711cf7909575bfb25720232c22c201efd06Tony Mantler        settings.getValueMap(map);
965d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy
966d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy        return map;
967d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy    }
968177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal
969177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal    /**
970177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal     * Public object that knows how to construct Accounts given Cursors.
971177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal     */
972177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal    public final static CursorCreator<Account> FACTORY = new CursorCreator<Account>() {
973177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal        @Override
974177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal        public Account createFromCursor(Cursor c) {
9754b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen            return builder().buildFrom(c);
976177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal        }
977177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal
978177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal        @Override
979177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal        public String toString() {
980177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal            return "Account CursorCreator";
981177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal        }
982177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal    };
98333fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira}
984