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