1ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal/******************************************************************************* 2ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * Copyright (C) 2012 Google Inc. 3ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * Licensed to The Android Open Source Project. 4ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * 5ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * Licensed under the Apache License, Version 2.0 (the "License"); 6ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * you may not use this file except in compliance with the License. 7ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * You may obtain a copy of the License at 8ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * 9ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * http://www.apache.org/licenses/LICENSE-2.0 10ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * 11ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * Unless required by applicable law or agreed to in writing, software 12ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * distributed under the License is distributed on an "AS IS" BASIS, 13ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * See the License for the specific language governing permissions and 15ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * limitations under the License. 16ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal *******************************************************************************/ 17ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 18ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwalpackage com.android.mail.providers; 19ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 20e0828393e175c9293c86a7490225f324cbec5eefMindy Pereiraimport android.content.Context; 21ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwalimport android.database.Cursor; 22a469bd23ae957d2907181f7ad67c14c07d8e8aa7Tony Mantlerimport android.graphics.PorterDuff; 23a469bd23ae957d2907181f7ad67c14c07d8e8aa7Tony Mantlerimport android.graphics.drawable.Drawable; 24a5603f3b3fe76c6527f45e81445cb93f92309d77Mindy Pereiraimport android.graphics.drawable.PaintDrawable; 25811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantlerimport android.graphics.drawable.StateListDrawable; 26cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereiraimport android.net.Uri; 27ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwalimport android.os.Parcel; 28ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwalimport android.os.Parcelable; 294a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwalimport android.text.TextUtils; 30811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantlerimport android.util.StateSet; 31a5603f3b3fe76c6527f45e81445cb93f92309d77Mindy Pereiraimport android.view.View; 32a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereiraimport android.widget.ImageView; 334a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 347614bb95010ed42b7848b8dcc902fab5d6b84246Rohan Shahimport com.android.mail.R; 35177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwalimport com.android.mail.content.CursorCreator; 36177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwalimport com.android.mail.content.ObjectCursorLoader; 3761bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedyimport com.android.mail.providers.UIProvider.FolderType; 38259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedyimport com.android.mail.utils.FolderUri; 392615aea2ce57f5fa3a9cd2e672282818aee6ce94mindypimport com.android.mail.utils.LogTag; 402615aea2ce57f5fa3a9cd2e672282818aee6ce94mindypimport com.android.mail.utils.LogUtils; 4155137b88f01521d15a0677b7105416bbc6528a49Mindy Pereiraimport com.android.mail.utils.Utils; 42d8c68c08dca0b45e7681a5756da73bced452c42dVikram Aggarwalimport com.google.common.annotations.VisibleForTesting; 43b373e3ec0e488914635345627f5734af0f0ef76bAndy Huangimport com.google.common.base.Objects; 44ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 454a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwalimport java.util.Collection; 46440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwalimport java.util.Collections; 478db7e407109532557718c6b8064792f2df7a073dMindy Pereiraimport java.util.HashMap; 48b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huangimport java.util.List; 498e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yangimport java.util.regex.Pattern; 504a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 51ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal/** 52ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * A folder is a collection of conversations, and perhaps other folders. 53ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal */ 54b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang// TODO: make most of these fields final 55c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huangpublic class Folder implements Parcelable, Comparable<Folder> { 568e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yang 578e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yang @Deprecated 588e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yang public static final String SPLITTER = "^*^"; 598e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yang @Deprecated 608e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yang private static final Pattern SPLITTER_REGEX = Pattern.compile("\\^\\*\\^"); 618e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yang 624a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal private static final String FOLDER_UNINITIALIZED = "Uninitialized!"; 634a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 6458cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal // TODO: remove this once we figure out which folder is returning a "null" string as the 653c0f419ee43909623a6ff72446894dbde91be45fPaul Westbrook // conversation list uri 663c0f419ee43909623a6ff72446894dbde91be45fPaul Westbrook private static final String NULL_STRING_URI = "null"; 672615aea2ce57f5fa3a9cd2e672282818aee6ce94mindyp private static final String LOG_TAG = LogTag.getLogTag(); 682615aea2ce57f5fa3a9cd2e672282818aee6ce94mindyp 69ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal // Try to match the order of members with the order of constants in UIProvider. 70ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 71ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal /** 72d92e9f3d45cfedd3ebfedcf0805283007053e091Mindy Pereira * Unique id of this folder. 73d92e9f3d45cfedd3ebfedcf0805283007053e091Mindy Pereira */ 747e5de7a9825120dcc6c94230ec5cd61b178fedf2Mindy Pereira public int id; 75d92e9f3d45cfedd3ebfedcf0805283007053e091Mindy Pereira 76d92e9f3d45cfedd3ebfedcf0805283007053e091Mindy Pereira /** 77d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy * Persistent (across installations) id of this folder. 78d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy */ 79d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy public String persistentId; 80d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy 81d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy /** 82ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * The content provider URI that returns this folder for this account. 83ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal */ 84259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedy public FolderUri folderUri; 85ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 86ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal /** 87ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * The human visible name for this folder. 88ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal */ 89ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal public String name; 90ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 91ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal /** 92ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * The possible capabilities that this folder supports. 93ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal */ 94ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal public int capabilities; 95ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 96ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal /** 97ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * Whether or not this folder has children folders. 98ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal */ 99ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal public boolean hasChildren; 100ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 101ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal /** 102ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * How large the synchronization window is: how many days worth of data is retained on the 103ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * device. 104ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal */ 105ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal public int syncWindow; 106ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 107ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal /** 108ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * The content provider URI to return the list of conversations in this 109ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * folder. 110ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal */ 111cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira public Uri conversationListUri; 112ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 113ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal /** 114ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * The content provider URI to return the list of child folders of this folder. 115ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal */ 116cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira public Uri childFoldersListUri; 117ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 118ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal /** 11961bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy * The number of messages that are unseen in this folder. 12061bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy */ 12161bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy public int unseenCount; 12261bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy 12361bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy /** 124ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * The number of messages that are unread in this folder. 125ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal */ 126ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal public int unreadCount; 127ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 128ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal /** 129ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal * The total number of messages in this folder. 130ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal */ 131ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal public int totalCount; 132ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 133ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal /** 1349c002107b4f3f052f744bb54a4ddca0f09a99d9eMindy Pereira * The content provider URI to force a refresh of this folder. 1359c002107b4f3f052f744bb54a4ddca0f09a99d9eMindy Pereira */ 136cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira public Uri refreshUri; 1379c002107b4f3f052f744bb54a4ddca0f09a99d9eMindy Pereira 1389c002107b4f3f052f744bb54a4ddca0f09a99d9eMindy Pereira /** 1399ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank * The current sync status of the folder 1407752864ebcff53a682c2b615802a675908c3d8fcMindy Pereira */ 1419ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank public int syncStatus; 1429ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank 1439ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank /** 14441b9e8f7bea47bbcae71b9ae81c3608a00a90e70Vikram Aggarwal * A packed integer containing the last synced result, and the request code. The 14541b9e8f7bea47bbcae71b9ae81c3608a00a90e70Vikram Aggarwal * value is (requestCode << 4) | syncResult 14641b9e8f7bea47bbcae71b9ae81c3608a00a90e70Vikram Aggarwal * syncResult is a value from {@link UIProvider.LastSyncResult} 14741b9e8f7bea47bbcae71b9ae81c3608a00a90e70Vikram Aggarwal * requestCode is a value from: {@link UIProvider.SyncStatus}, 1489ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank */ 1499ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank public int lastSyncResult; 1507752864ebcff53a682c2b615802a675908c3d8fcMindy Pereira 1517752864ebcff53a682c2b615802a675908c3d8fcMindy Pereira /** 1528c1058ee75ec4a5824a68c3c5275bc48d56bbad8Scott Kennedy * Folder type bit mask. 0 is default. 1538c1058ee75ec4a5824a68c3c5275bc48d56bbad8Scott Kennedy * @see FolderType 1547866472df1b6cfee8345493e43468d854680fadcMindy Pereira */ 1557866472df1b6cfee8345493e43468d854680fadcMindy Pereira public int type; 1567866472df1b6cfee8345493e43468d854680fadcMindy Pereira 1577866472df1b6cfee8345493e43468d854680fadcMindy Pereira /** 1587866472df1b6cfee8345493e43468d854680fadcMindy Pereira * Icon for this folder; 0 implies no icon. 1597866472df1b6cfee8345493e43468d854680fadcMindy Pereira */ 16061bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy public int iconResId; 16161bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy 16261bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy /** 16361bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy * Notification icon for this folder; 0 implies no icon. 16461bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy */ 16561bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy public int notificationIconResId; 1667866472df1b6cfee8345493e43468d854680fadcMindy Pereira 1679275a069355a0cc1b78882387220d5364404b537Mindy Pereira public String bgColor; 1689275a069355a0cc1b78882387220d5364404b537Mindy Pereira public String fgColor; 1699275a069355a0cc1b78882387220d5364404b537Mindy Pereira 170f7cf01fce296bd036740ada529d4ea8502692e88Tony Mantler private int bgColorInt; 171f7cf01fce296bd036740ada529d4ea8502692e88Tony Mantler private int fgColorInt; 172b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang 1737866472df1b6cfee8345493e43468d854680fadcMindy Pereira /** 17448a4aed2e943debf725564808944e7c9e46dce5dMarc Blank * The content provider URI to request additional conversations 17548a4aed2e943debf725564808944e7c9e46dce5dMarc Blank */ 17648a4aed2e943debf725564808944e7c9e46dce5dMarc Blank public Uri loadMoreUri; 17748a4aed2e943debf725564808944e7c9e46dce5dMarc Blank 17848a4aed2e943debf725564808944e7c9e46dce5dMarc Blank /** 179c1e8790e4a1a1ec9ae8cb33cf85df3753c944ff6Mindy Pereira * The possibly empty name of this folder with full hierarchy. 18061cea951d1e813941b80bba7438745541e5133eaMindy Pereira * The expected format is: parent/folder1/folder2/folder3/folder4 181c1e8790e4a1a1ec9ae8cb33cf85df3753c944ff6Mindy Pereira */ 182c1e8790e4a1a1ec9ae8cb33cf85df3753c944ff6Mindy Pereira public String hierarchicalDesc; 183c1e8790e4a1a1ec9ae8cb33cf85df3753c944ff6Mindy Pereira 184c1e8790e4a1a1ec9ae8cb33cf85df3753c944ff6Mindy Pereira /** 185a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal * Parent folder of this folder, or null if there is none. 18611e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira */ 187a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal public Uri parent; 18811e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira 1897c8325de829ca029ce4547e4f0fa266124301367Scott Kennedy /** 1907c8325de829ca029ce4547e4f0fa266124301367Scott Kennedy * The time at which the last message was received. 1917c8325de829ca029ce4547e4f0fa266124301367Scott Kennedy */ 1927c8325de829ca029ce4547e4f0fa266124301367Scott Kennedy public long lastMessageTimestamp; 1937c8325de829ca029ce4547e4f0fa266124301367Scott Kennedy 19442fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler /** 19542fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler * A string of unread senders sorted by date, so we don't have to fetch this in multiple queries 19642fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler */ 19742fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler public String unreadSenders; 19842fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler 199440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal /** An immutable, empty conversation list */ 200440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal public static final Collection<Folder> EMPTY = Collections.emptyList(); 201440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal 20242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public static final class Builder { 20342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private int mId; 20442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private String mPersistentId; 20542fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private Uri mUri; 20642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private String mName; 20742fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private int mCapabilities; 20842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private boolean mHasChildren; 20942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private int mSyncWindow; 21042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private Uri mConversationListUri; 21142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private Uri mChildFoldersListUri; 21242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private int mUnseenCount; 21342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private int mUnreadCount; 21442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private int mTotalCount; 21542fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private Uri mRefreshUri; 21642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private int mSyncStatus; 21742fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private int mLastSyncResult; 21842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private int mType; 21942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private int mIconResId; 22042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private int mNotificationIconResId; 22142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private String mBgColor; 22242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private String mFgColor; 22342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private Uri mLoadMoreUri; 22442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private String mHierarchicalDesc; 22542fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private Uri mParent; 22642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler private long mLastMessageTimestamp; 22742fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler private String mUnreadSenders; 22842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler 22942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Folder build() { 23042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return new Folder(mId, mPersistentId, mUri, mName, mCapabilities, 23142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mHasChildren, mSyncWindow, mConversationListUri, mChildFoldersListUri, 23242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mUnseenCount, mUnreadCount, mTotalCount, mRefreshUri, mSyncStatus, 23342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mLastSyncResult, mType, mIconResId, mNotificationIconResId, mBgColor, 23442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mFgColor, mLoadMoreUri, mHierarchicalDesc, mParent, 23542fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler mLastMessageTimestamp, mUnreadSenders); 23642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 23742fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler 23842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setId(final int id) { 23942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mId = id; 24042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 24142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 24242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setPersistentId(final String persistentId) { 24342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mPersistentId = persistentId; 24442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 24542fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 24642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setUri(final Uri uri) { 24742fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mUri = uri; 24842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 24942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 25042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setName(final String name) { 25142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mName = name; 25242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 25342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 25442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setCapabilities(final int capabilities) { 25542fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mCapabilities = capabilities; 25642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 25742fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 25842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setHasChildren(final boolean hasChildren) { 25942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mHasChildren = hasChildren; 26042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 26142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 26242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setSyncWindow(final int syncWindow) { 26342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mSyncWindow = syncWindow; 26442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 26542fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 26642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setConversationListUri(final Uri conversationListUri) { 26742fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mConversationListUri = conversationListUri; 26842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 26942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 27042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setChildFoldersListUri(final Uri childFoldersListUri) { 27142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mChildFoldersListUri = childFoldersListUri; 27242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 27342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 27442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setUnseenCount(final int unseenCount) { 27542fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mUnseenCount = unseenCount; 27642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 27742fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 27842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setUnreadCount(final int unreadCount) { 27942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mUnreadCount = unreadCount; 28042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 28142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 28242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setTotalCount(final int totalCount) { 28342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mTotalCount = totalCount; 28442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 28542fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 28642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setRefreshUri(final Uri refreshUri) { 28742fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mRefreshUri = refreshUri; 28842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 28942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 29042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setSyncStatus(final int syncStatus) { 29142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mSyncStatus = syncStatus; 29242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 29342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 29442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setLastSyncResult(final int lastSyncResult) { 29542fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mLastSyncResult = lastSyncResult; 29642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 29742fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 29842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setType(final int type) { 29942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mType = type; 30042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 30142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 30242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setIconResId(final int iconResId) { 30342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mIconResId = iconResId; 30442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 30542fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 30642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setNotificationIconResId(final int notificationIconResId) { 30742fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mNotificationIconResId = notificationIconResId; 30842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 30942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 31042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setBgColor(final String bgColor) { 31142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mBgColor = bgColor; 31242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 31342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 31442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setFgColor(final String fgColor) { 31542fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mFgColor = fgColor; 31642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 31742fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 31842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setLoadMoreUri(final Uri loadMoreUri) { 31942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mLoadMoreUri = loadMoreUri; 32042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 32142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 32242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setHierarchicalDesc(final String hierarchicalDesc) { 32342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mHierarchicalDesc = hierarchicalDesc; 32442fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 32542fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 32642fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setParent(final Uri parent) { 32742fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mParent = parent; 32842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 32942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 33042fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler public Builder setLastMessageTimestamp(final long lastMessageTimestamp) { 33142fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler mLastMessageTimestamp = lastMessageTimestamp; 33242fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler return this; 33342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 33442fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler public Builder setUnreadSenders(final String unreadSenders) { 33542fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler mUnreadSenders = unreadSenders; 33642fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler return this; 33742fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler } 33842fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler } 33942fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler 340d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy public Folder(int id, String persistentId, Uri uri, String name, int capabilities, 341d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy boolean hasChildren, int syncWindow, Uri conversationListUri, Uri childFoldersListUri, 34261bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy int unseenCount, int unreadCount, int totalCount, Uri refreshUri, int syncStatus, 34361bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy int lastSyncResult, int type, int iconResId, int notificationIconResId, String bgColor, 344a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal String fgColor, Uri loadMoreUri, String hierarchicalDesc, Uri parent, 34542fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler final long lastMessageTimestamp, final String unreadSenders) { 346b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.id = id; 347d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy this.persistentId = persistentId; 348259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedy this.folderUri = new FolderUri(uri); 349b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.name = name; 350b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.capabilities = capabilities; 351b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.hasChildren = hasChildren; 352b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.syncWindow = syncWindow; 353b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.conversationListUri = conversationListUri; 354b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.childFoldersListUri = childFoldersListUri; 35561bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy this.unseenCount = unseenCount; 356b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.unreadCount = unreadCount; 357b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.totalCount = totalCount; 358b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.refreshUri = refreshUri; 359b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.syncStatus = syncStatus; 360b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.lastSyncResult = lastSyncResult; 361b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.type = type; 362b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.iconResId = iconResId; 363b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.bgColor = bgColor; 364b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.fgColor = fgColor; 36559737eef2716355c4a3ca17fbc8bde497fb6eb32Rohan Shah if (!TextUtils.isEmpty(bgColor)) { 366b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang this.bgColorInt = Integer.parseInt(bgColor); 367b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang } 36859737eef2716355c4a3ca17fbc8bde497fb6eb32Rohan Shah if (!TextUtils.isEmpty(fgColor)) { 369b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang this.fgColorInt = Integer.parseInt(fgColor); 370b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang } 371b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.loadMoreUri = loadMoreUri; 372b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang this.hierarchicalDesc = hierarchicalDesc; 3737c8325de829ca029ce4547e4f0fa266124301367Scott Kennedy this.lastMessageTimestamp = lastMessageTimestamp; 374a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal this.parent = parent; 37542fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler this.unreadSenders = unreadSenders; 376b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang } 377b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang 378ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal public Folder(Cursor cursor) { 3797e5de7a9825120dcc6c94230ec5cd61b178fedf2Mindy Pereira id = cursor.getInt(UIProvider.FOLDER_ID_COLUMN); 380d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy persistentId = cursor.getString(UIProvider.FOLDER_PERSISTENT_ID_COLUMN); 381259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedy folderUri = 382259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedy new FolderUri(Uri.parse(cursor.getString(UIProvider.FOLDER_URI_COLUMN))); 383ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal name = cursor.getString(UIProvider.FOLDER_NAME_COLUMN); 384ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal capabilities = cursor.getInt(UIProvider.FOLDER_CAPABILITIES_COLUMN); 385ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal // 1 for true, 0 for false. 386ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal hasChildren = cursor.getInt(UIProvider.FOLDER_HAS_CHILDREN_COLUMN) == 1; 387ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal syncWindow = cursor.getInt(UIProvider.FOLDER_SYNC_WINDOW_COLUMN); 38848a4aed2e943debf725564808944e7c9e46dce5dMarc Blank String convList = cursor.getString(UIProvider.FOLDER_CONVERSATION_LIST_URI_COLUMN); 38948a4aed2e943debf725564808944e7c9e46dce5dMarc Blank conversationListUri = !TextUtils.isEmpty(convList) ? Uri.parse(convList) : null; 39048a4aed2e943debf725564808944e7c9e46dce5dMarc Blank String childList = cursor.getString(UIProvider.FOLDER_CHILD_FOLDERS_LIST_COLUMN); 39148a4aed2e943debf725564808944e7c9e46dce5dMarc Blank childFoldersListUri = (hasChildren && !TextUtils.isEmpty(childList)) ? Uri.parse(childList) 39248a4aed2e943debf725564808944e7c9e46dce5dMarc Blank : null; 39361bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy unseenCount = cursor.getInt(UIProvider.FOLDER_UNSEEN_COUNT_COLUMN); 394ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal unreadCount = cursor.getInt(UIProvider.FOLDER_UNREAD_COUNT_COLUMN); 395ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal totalCount = cursor.getInt(UIProvider.FOLDER_TOTAL_COUNT_COLUMN); 396cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira String refresh = cursor.getString(UIProvider.FOLDER_REFRESH_URI_COLUMN); 397cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira refreshUri = !TextUtils.isEmpty(refresh) ? Uri.parse(refresh) : null; 3989ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank syncStatus = cursor.getInt(UIProvider.FOLDER_SYNC_STATUS_COLUMN); 3999ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank lastSyncResult = cursor.getInt(UIProvider.FOLDER_LAST_SYNC_RESULT_COLUMN); 4007866472df1b6cfee8345493e43468d854680fadcMindy Pereira type = cursor.getInt(UIProvider.FOLDER_TYPE_COLUMN); 40161bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy iconResId = cursor.getInt(UIProvider.FOLDER_ICON_RES_ID_COLUMN); 4029275a069355a0cc1b78882387220d5364404b537Mindy Pereira bgColor = cursor.getString(UIProvider.FOLDER_BG_COLOR_COLUMN); 4039275a069355a0cc1b78882387220d5364404b537Mindy Pereira fgColor = cursor.getString(UIProvider.FOLDER_FG_COLOR_COLUMN); 40459737eef2716355c4a3ca17fbc8bde497fb6eb32Rohan Shah if (!TextUtils.isEmpty(bgColor)) { 405b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang bgColorInt = Integer.parseInt(bgColor); 406b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang } 40759737eef2716355c4a3ca17fbc8bde497fb6eb32Rohan Shah if (!TextUtils.isEmpty(fgColor)) { 408b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang fgColorInt = Integer.parseInt(fgColor); 409b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang } 41048a4aed2e943debf725564808944e7c9e46dce5dMarc Blank String loadMore = cursor.getString(UIProvider.FOLDER_LOAD_MORE_URI_COLUMN); 41148a4aed2e943debf725564808944e7c9e46dce5dMarc Blank loadMoreUri = !TextUtils.isEmpty(loadMore) ? Uri.parse(loadMore) : null; 412c1e8790e4a1a1ec9ae8cb33cf85df3753c944ff6Mindy Pereira hierarchicalDesc = cursor.getString(UIProvider.FOLDER_HIERARCHICAL_DESC_COLUMN); 4137c8325de829ca029ce4547e4f0fa266124301367Scott Kennedy lastMessageTimestamp = cursor.getLong(UIProvider.FOLDER_LAST_MESSAGE_TIMESTAMP_COLUMN); 414a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal // A null parent URI means that this is a top-level folder. 415a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal final String parentString = cursor.getString(UIProvider.FOLDER_PARENT_URI_COLUMN); 416a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal parent = parentString == null ? Uri.EMPTY : Uri.parse(parentString); 41742fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler final int unreadSendersColumn = 41842fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler cursor.getColumnIndex(UIProvider.FolderColumns.UNREAD_SENDERS); 41942fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler if (unreadSendersColumn != -1) { 42042fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler unreadSenders = cursor.getString(unreadSendersColumn); 42142fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler } else { 42242fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler unreadSenders = null; 42342fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler } 424ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal } 425ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 426177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal /** 427177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal * Public object that knows how to construct Folders given Cursors. 428177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal */ 429177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal public static final CursorCreator<Folder> FACTORY = new CursorCreator<Folder>() { 430177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal @Override 431177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal public Folder createFromCursor(Cursor c) { 432177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal return new Folder(c); 433177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal } 434177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal 435177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal @Override 436177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal public String toString() { 437177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal return "Folder CursorCreator"; 438177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal } 439177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal }; 440177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal 4419076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy public Folder(Parcel in, ClassLoader loader) { 4429076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy id = in.readInt(); 4439076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy persistentId = in.readString(); 444259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedy folderUri = new FolderUri((Uri) in.readParcelable(loader)); 4459076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy name = in.readString(); 4469076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy capabilities = in.readInt(); 4479076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy // 1 for true, 0 for false. 4489076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy hasChildren = in.readInt() == 1; 4499076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy syncWindow = in.readInt(); 4509076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy conversationListUri = in.readParcelable(loader); 4519076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy childFoldersListUri = in.readParcelable(loader); 4529076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy unseenCount = in.readInt(); 4539076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy unreadCount = in.readInt(); 4549076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy totalCount = in.readInt(); 4559076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy refreshUri = in.readParcelable(loader); 4569076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy syncStatus = in.readInt(); 4579076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy lastSyncResult = in.readInt(); 4589076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy type = in.readInt(); 4599076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy iconResId = in.readInt(); 4609076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy bgColor = in.readString(); 4619076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy fgColor = in.readString(); 46259737eef2716355c4a3ca17fbc8bde497fb6eb32Rohan Shah if (!TextUtils.isEmpty(bgColor)) { 463b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang bgColorInt = Integer.parseInt(bgColor); 464b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang } 46559737eef2716355c4a3ca17fbc8bde497fb6eb32Rohan Shah if (!TextUtils.isEmpty(fgColor)) { 466b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang fgColorInt = Integer.parseInt(fgColor); 467b53fe05fb867685d0d3f2f37daf0f93bc6488dedAndy Huang } 4689076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy loadMoreUri = in.readParcelable(loader); 4699076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy hierarchicalDesc = in.readString(); 4709076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy parent = in.readParcelable(loader); 4717c8325de829ca029ce4547e4f0fa266124301367Scott Kennedy lastMessageTimestamp = in.readLong(); 472a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal parent = in.readParcelable(loader); 47342fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler unreadSenders = in.readString(); 4749076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy } 4759076460079688667a9cf4205b7cd71ac6e8b11e5Scott Kennedy 476ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal @Override 477ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal public void writeToParcel(Parcel dest, int flags) { 4787e5de7a9825120dcc6c94230ec5cd61b178fedf2Mindy Pereira dest.writeInt(id); 479d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy dest.writeString(persistentId); 480e6c33066d3fc9f558de5dd7a89137414d7726300Paul Westbrook dest.writeParcelable(folderUri != null ? folderUri.fullUri : null, 0); 481ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal dest.writeString(name); 482ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal dest.writeInt(capabilities); 483ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal // 1 for true, 0 for false. 484ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal dest.writeInt(hasChildren ? 1 : 0); 485ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal dest.writeInt(syncWindow); 486cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira dest.writeParcelable(conversationListUri, 0); 487cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira dest.writeParcelable(childFoldersListUri, 0); 48861bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy dest.writeInt(unseenCount); 489ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal dest.writeInt(unreadCount); 490ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal dest.writeInt(totalCount); 491cfb7f33ff8ef9dc60b9143af32de64c7a3d71f36Mindy Pereira dest.writeParcelable(refreshUri, 0); 4929ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank dest.writeInt(syncStatus); 4939ace18a77e1c61700291f6116bb8162c8fce1fadMarc Blank dest.writeInt(lastSyncResult); 4947866472df1b6cfee8345493e43468d854680fadcMindy Pereira dest.writeInt(type); 49561bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy dest.writeInt(iconResId); 4969275a069355a0cc1b78882387220d5364404b537Mindy Pereira dest.writeString(bgColor); 4979275a069355a0cc1b78882387220d5364404b537Mindy Pereira dest.writeString(fgColor); 49848a4aed2e943debf725564808944e7c9e46dce5dMarc Blank dest.writeParcelable(loadMoreUri, 0); 499c1e8790e4a1a1ec9ae8cb33cf85df3753c944ff6Mindy Pereira dest.writeString(hierarchicalDesc); 50011e3596e8c5978d07195ae2d7c8a96bb51aa75b3Mindy Pereira dest.writeParcelable(parent, 0); 5017c8325de829ca029ce4547e4f0fa266124301367Scott Kennedy dest.writeLong(lastMessageTimestamp); 502a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal dest.writeParcelable(parent, 0); 50342fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler dest.writeString(unreadSenders); 504ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal } 505ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 5064a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal /** 507e0828393e175c9293c86a7490225f324cbec5eefMindy Pereira * Construct a folder that queries for search results. Do not call on the UI 508e0828393e175c9293c86a7490225f324cbec5eefMindy Pereira * thread. 509e0828393e175c9293c86a7490225f324cbec5eefMindy Pereira */ 510177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal public static ObjectCursorLoader<Folder> forSearchResults(Account account, String query, 5111a864cce6321f46031d6cd43e205278d0f219f92Jin Cao String queryIdentifier, Context context) { 512b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira if (account.searchUri != null) { 51342fa39a93a57fa123cdd69ed41815c739a1e3adeTony Mantler final Uri.Builder searchBuilder = account.searchUri.buildUpon(); 514b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira searchBuilder.appendQueryParameter(UIProvider.SearchQueryParameters.QUERY, query); 5151a864cce6321f46031d6cd43e205278d0f219f92Jin Cao searchBuilder.appendQueryParameter(UIProvider.SearchQueryParameters.QUERY_IDENTIFER, 5161a864cce6321f46031d6cd43e205278d0f219f92Jin Cao queryIdentifier); 517177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal final Uri searchUri = searchBuilder.build(); 518177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal return new ObjectCursorLoader<Folder>(context, searchUri, UIProvider.FOLDERS_PROJECTION, 519177097fad8fc26b8a215f9f1af6dd5fd2c8eb06cVikram Aggarwal FACTORY); 520b849dfbda3c917f078a5c09f03906886c27ecbecMindy Pereira } 521ab4863650794e81f35a0fd9abc16a5564d7b102bMindy Pereira return null; 52268f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira } 52368f2e222b4ffccd9f67f02b3a9cfdb3841a7eb43Mindy Pereira 524b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang public static HashMap<Uri, Folder> hashMapForFolders(List<Folder> rawFolders) { 5258db7e407109532557718c6b8064792f2df7a073dMindy Pereira final HashMap<Uri, Folder> folders = new HashMap<Uri, Folder>(); 52668f83843e821d9627a53f68244dbc4cb26662edcMindy Pereira for (Folder f : rawFolders) { 527cd686c1cd99379c6d3ab66ccbfd7f6ae4e4eb67bScott Kennedy folders.put(f.folderUri.getComparisonUri(), f); 528c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang } 529c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang return folders; 530c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang } 531c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang 5324a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal /** 5330c3c2058f75487713c64634c7f08025fd78ba012Vikram Aggarwal * Constructor that leaves everything uninitialized. 5344a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal */ 5350c3c2058f75487713c64634c7f08025fd78ba012Vikram Aggarwal private Folder() { 5364a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal name = FOLDER_UNINITIALIZED; 5374a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal } 5384a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 5390c3c2058f75487713c64634c7f08025fd78ba012Vikram Aggarwal /** 5400c3c2058f75487713c64634c7f08025fd78ba012Vikram Aggarwal * Creates a new instance of a folder object that is <b>not</b> initialized. The caller is 541d8c68c08dca0b45e7681a5756da73bced452c42dVikram Aggarwal * expected to fill in the details. Used only for testing. 5420c3c2058f75487713c64634c7f08025fd78ba012Vikram Aggarwal * @return a new instance of an unsafe folder. 5430c3c2058f75487713c64634c7f08025fd78ba012Vikram Aggarwal */ 544d8c68c08dca0b45e7681a5756da73bced452c42dVikram Aggarwal @VisibleForTesting 5450c3c2058f75487713c64634c7f08025fd78ba012Vikram Aggarwal public static Folder newUnsafeInstance() { 5460c3c2058f75487713c64634c7f08025fd78ba012Vikram Aggarwal return new Folder(); 5470c3c2058f75487713c64634c7f08025fd78ba012Vikram Aggarwal } 5480c3c2058f75487713c64634c7f08025fd78ba012Vikram Aggarwal 549b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang public static final ClassLoaderCreator<Folder> CREATOR = new ClassLoaderCreator<Folder>() { 550ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal @Override 551ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal public Folder createFromParcel(Parcel source) { 552b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang return new Folder(source, null); 553b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang } 554b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang 555b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang @Override 556b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang public Folder createFromParcel(Parcel source, ClassLoader loader) { 557b2033d855ab0f13e253e5403ce25989bcbc49488Andy Huang return new Folder(source, loader); 558ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal } 559ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 560ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal @Override 561ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal public Folder[] newArray(int size) { 562ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal return new Folder[size]; 563ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal } 564ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal }; 565ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal 566ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal @Override 567ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal public int describeContents() { 568ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal // Return a sort of version number for this parcelable folder. Starting with zero. 569ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal return 0; 570ff7d02ac1660d0f4bca9fce1f2033a6ea19c94c2Vikram Aggarwal } 5714a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal 572c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang @Override 573c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang public boolean equals(Object o) { 574c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang if (o == null || !(o instanceof Folder)) { 575c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang return false; 576c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang } 577259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedy return Objects.equal(folderUri, ((Folder) o).folderUri); 578c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang } 579c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang 580c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang @Override 581c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang public int hashCode() { 582259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedy return folderUri == null ? 0 : folderUri.hashCode(); 583c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang } 584c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang 585c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang @Override 5869e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang public String toString() { 5879e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang // log extra info at DEBUG level or finer 588a90c33b7db2f47cd1e8129dd8c262e9e3e329f71Andy Huang final StringBuilder sb = new StringBuilder(super.toString()); 589a90c33b7db2f47cd1e8129dd8c262e9e3e329f71Andy Huang sb.append("{id="); 5909e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang sb.append(id); 5919e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang if (LogUtils.isLoggable(LOG_TAG, LogUtils.DEBUG)) { 5929e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang sb.append(", uri="); 593259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedy sb.append(folderUri); 5949e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang sb.append(", name="); 5959e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang sb.append(name); 596a90c33b7db2f47cd1e8129dd8c262e9e3e329f71Andy Huang sb.append(", count="); 597a90c33b7db2f47cd1e8129dd8c262e9e3e329f71Andy Huang sb.append(totalCount); 5989e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang } 599a90c33b7db2f47cd1e8129dd8c262e9e3e329f71Andy Huang sb.append("}"); 6009e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang return sb.toString(); 6019e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang } 6029e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang 6039e4ca7993213d296043d20fe9cf4e166b5d595e8Andy Huang @Override 604c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang public int compareTo(Folder other) { 605c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang return name.compareToIgnoreCase(other.name); 606c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang } 607c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang 6084a5c530b0a67e22bd74df8f10f29278dc8d86459Vikram Aggarwal /** 609c808fac6076182c77fd5348f5136d325c6e34e14Paul Westbrook * Returns a boolean indicating whether network activity (sync) is occuring for this folder. 610c808fac6076182c77fd5348f5136d325c6e34e14Paul Westbrook */ 611c808fac6076182c77fd5348f5136d325c6e34e14Paul Westbrook public boolean isSyncInProgress() { 61270a70c92bca006af84177d025c32deee3aa6da3fMindy Pereira return UIProvider.SyncStatus.isSyncInProgress(syncStatus); 613c808fac6076182c77fd5348f5136d325c6e34e14Paul Westbrook } 614c808fac6076182c77fd5348f5136d325c6e34e14Paul Westbrook 615334e64af904085984cdcbecbcbc18cf488a9ceaePaul Westbrook public boolean supportsCapability(int capability) { 616334e64af904085984cdcbecbcbc18cf488a9ceaePaul Westbrook return (capabilities & capability) != 0; 617334e64af904085984cdcbecbcbc18cf488a9ceaePaul Westbrook } 618a5603f3b3fe76c6527f45e81445cb93f92309d77Mindy Pereira 61930fd47bf1947da5ad813cb957b6cbe569dce563aMindy Pereira // Show black text on a transparent swatch for system folders, effectively hiding the 620a5603f3b3fe76c6527f45e81445cb93f92309d77Mindy Pereira // swatch (see bug 2431925). 621a5603f3b3fe76c6527f45e81445cb93f92309d77Mindy Pereira public static void setFolderBlockColor(Folder folder, View colorBlock) { 622a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira if (colorBlock == null) { 623a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira return; 624a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira } 62561bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy boolean showBg = 6268c1058ee75ec4a5824a68c3c5275bc48d56bbad8Scott Kennedy !TextUtils.isEmpty(folder.bgColor) && (folder.type & FolderType.INBOX_SECTION) == 0; 62795e3b7a80f33bc40efd576fddfdca9b369052fbdMindy Pereira final int backgroundColor = showBg ? Integer.parseInt(folder.bgColor) : 0; 62855137b88f01521d15a0677b7105416bbc6528a49Mindy Pereira if (backgroundColor == Utils.getDefaultFolderBackgroundColor(colorBlock.getContext())) { 62955137b88f01521d15a0677b7105416bbc6528a49Mindy Pereira showBg = false; 63055137b88f01521d15a0677b7105416bbc6528a49Mindy Pereira } 631a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira if (!showBg) { 632a5603f3b3fe76c6527f45e81445cb93f92309d77Mindy Pereira colorBlock.setBackgroundDrawable(null); 633a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira colorBlock.setVisibility(View.GONE); 634a5603f3b3fe76c6527f45e81445cb93f92309d77Mindy Pereira } else { 635a5603f3b3fe76c6527f45e81445cb93f92309d77Mindy Pereira PaintDrawable paintDrawable = new PaintDrawable(); 636a5603f3b3fe76c6527f45e81445cb93f92309d77Mindy Pereira paintDrawable.getPaint().setColor(backgroundColor); 637a5603f3b3fe76c6527f45e81445cb93f92309d77Mindy Pereira colorBlock.setBackgroundDrawable(paintDrawable); 638a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira colorBlock.setVisibility(View.VISIBLE); 639a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira } 640a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira } 641a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira 642811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler private static final int[] ACTIVATED_STATE_LIST = new int[] {android.R.attr.state_activated}; 643811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler 644a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira public static void setIcon(Folder folder, ImageView iconView) { 645a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira if (iconView == null) { 646a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira return; 647a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira } 6487614bb95010ed42b7848b8dcc902fab5d6b84246Rohan Shah int icon = folder.iconResId; 6497614bb95010ed42b7848b8dcc902fab5d6b84246Rohan Shah 6507614bb95010ed42b7848b8dcc902fab5d6b84246Rohan Shah // If we're using the default folders, make sure we show the parent icon 6517614bb95010ed42b7848b8dcc902fab5d6b84246Rohan Shah if (icon == R.drawable.ic_drawer_folder_24dp && folder.hasChildren) { 6527614bb95010ed42b7848b8dcc902fab5d6b84246Rohan Shah icon = R.drawable.ic_folder_parent_24dp; 6537614bb95010ed42b7848b8dcc902fab5d6b84246Rohan Shah } 6547614bb95010ed42b7848b8dcc902fab5d6b84246Rohan Shah 655a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira if (icon > 0) { 656811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler final Drawable defaultIconDrawable = iconView.getResources().getDrawable(icon); 657811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler if (defaultIconDrawable != null) { 658811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler final Drawable iconDrawable; 659811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler if (folder.supportsCapability(UIProvider.FolderCapabilities.TINT_ICON)) { 660811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler // Default multiply by white 661811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler defaultIconDrawable.mutate().setColorFilter(folder.getBackgroundColor(0xFFFFFF), 662811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler PorterDuff.Mode.MULTIPLY); 663811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler iconDrawable = defaultIconDrawable; 664811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler } else { 665811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler final StateListDrawable listDrawable = new StateListDrawable(); 666811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler 667811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler final Drawable activatedIconDrawable = 668811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler iconView.getResources().getDrawable(icon); 669811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler activatedIconDrawable.mutate().setColorFilter(0xff000000, 670811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler PorterDuff.Mode.MULTIPLY); 671811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler 672811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler listDrawable.addState(ACTIVATED_STATE_LIST, activatedIconDrawable); 673811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler listDrawable.addState(StateSet.WILD_CARD, defaultIconDrawable); 674811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler 675811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler iconDrawable = listDrawable; 676811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler } 677811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler iconView.setImageDrawable(iconDrawable); 678811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler } else { 679811c704ddcf180c4fd4ac0e2800ea8eea34af3e9Tony Mantler iconView.setImageDrawable(null); 680a469bd23ae957d2907181f7ad67c14c07d8e8aa7Tony Mantler } 681a716ddb162e23aab7c202460e5a475db97a71a8dMindy Pereira } else { 68269086fd48a2e1565806dfd953116d11ab735ab84Tony Mantler LogUtils.e(LogUtils.TAG, "No icon returned for folder %s", folder); 683a5603f3b3fe76c6527f45e81445cb93f92309d77Mindy Pereira } 684a5603f3b3fe76c6527f45e81445cb93f92309d77Mindy Pereira } 685b5080d5335d2aa445a660ad426ab008750be24cbMindy Pereira 686b5080d5335d2aa445a660ad426ab008750be24cbMindy Pereira /** 687b5080d5335d2aa445a660ad426ab008750be24cbMindy Pereira * Return if the type of the folder matches a provider defined folder. 688b5080d5335d2aa445a660ad426ab008750be24cbMindy Pereira */ 6898eca4db9069941d2b8afbe6f75e3af75a4310f27Andy Huang public boolean isProviderFolder() { 690771d8ba9b3ab21fc7e39a02a107b292ef1f660aeScott Kennedy return !isType(UIProvider.FolderType.DEFAULT); 691b5080d5335d2aa445a660ad426ab008750be24cbMindy Pereira } 692c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang 693c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang public int getBackgroundColor(int defaultColor) { 69459737eef2716355c4a3ca17fbc8bde497fb6eb32Rohan Shah return !TextUtils.isEmpty(bgColor) ? bgColorInt : defaultColor; 695c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang } 696c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang 697c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang public int getForegroundColor(int defaultColor) { 69859737eef2716355c4a3ca17fbc8bde497fb6eb32Rohan Shah return !TextUtils.isEmpty(fgColor) ? fgColorInt : defaultColor; 699c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang } 700c03208720e5650f0acb748f82ed10ac770d6ceb4Andy Huang 701bc67bb1211654e69b1233e0f8759771873ca773eVikram Aggarwal /** 70200ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira * Get just the uri's from an arraylist of folders. 70300ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira */ 704a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal public static String[] getUriArray(List<Folder> folders) { 7054e812f49c5bbba50a60d062d624403952f8d5487Mindy Pereira if (folders == null || folders.size() == 0) { 7064e812f49c5bbba50a60d062d624403952f8d5487Mindy Pereira return new String[0]; 7074e812f49c5bbba50a60d062d624403952f8d5487Mindy Pereira } 708a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal final String[] folderUris = new String[folders.size()]; 70900ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira int i = 0; 71000ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira for (Folder folder : folders) { 711259df5b9e11908c8ef7c91483924891dd96b3c27Scott Kennedy folderUris[i] = folder.folderUri.toString(); 71200ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira i++; 71300ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira } 71400ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira return folderUris; 71500ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira } 71600ffece08e94ff5774b2a53c0adeb2f3d0815d66Mindy Pereira 717440fe79194314b25ef5829702494735ce2f1e2e8Vikram Aggarwal /** 7184bfce9ada8b2a6d54ec21a11ba78aaaebe6cfc2fPaul Westbrook * Returns a boolean indicating whether this Folder object has been initialized 7194bfce9ada8b2a6d54ec21a11ba78aaaebe6cfc2fPaul Westbrook */ 7204bfce9ada8b2a6d54ec21a11ba78aaaebe6cfc2fPaul Westbrook public boolean isInitialized() { 721d8fa038aa7235468ecdcf2cda4e4d70eb97ba520Vikram Aggarwal return !name.equals(FOLDER_UNINITIALIZED) && conversationListUri != null && 7223c0f419ee43909623a6ff72446894dbde91be45fPaul Westbrook !NULL_STRING_URI.equals(conversationListUri.toString()); 7234bfce9ada8b2a6d54ec21a11ba78aaaebe6cfc2fPaul Westbrook } 7244bfce9ada8b2a6d54ec21a11ba78aaaebe6cfc2fPaul Westbrook 7258c1058ee75ec4a5824a68c3c5275bc48d56bbad8Scott Kennedy public boolean isType(final int folderType) { 726739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy return isType(type, folderType); 727739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy } 728739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy 729739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy /** 730739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy * Checks if <code>typeMask</code> is of the specified {@link FolderType} 731739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy * 732739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy * @return <code>true</code> if the mask contains the specified 733739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy * {@link FolderType}, <code>false</code> otherwise 734739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy */ 735739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy public static boolean isType(final int typeMask, final int folderType) { 736739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy return (typeMask & folderType) != 0; 7378c1058ee75ec4a5824a68c3c5275bc48d56bbad8Scott Kennedy } 7388c1058ee75ec4a5824a68c3c5275bc48d56bbad8Scott Kennedy 739a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein /** 740a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein * Returns {@code true} if this folder is an inbox folder. 741a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein */ 7428c1058ee75ec4a5824a68c3c5275bc48d56bbad8Scott Kennedy public boolean isInbox() { 743a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein return isType(FolderType.INBOX); 744a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein } 745a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein 746a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein /** 747a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein * Returns {@code true} if this folder is a search folder. 748a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein */ 749a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein public boolean isSearch() { 750a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein return isType(FolderType.SEARCH); 751a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein } 752a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein 753a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein /** 754a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein * Returns {@code true} if this folder is the spam folder. 755a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein */ 756a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein public boolean isSpam() { 757a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein return isType(FolderType.SPAM); 7588c1058ee75ec4a5824a68c3c5275bc48d56bbad8Scott Kennedy } 7598c1058ee75ec4a5824a68c3c5275bc48d56bbad8Scott Kennedy 760b807337282fb19d1a38cdbe092a2f472b0e30321Mindy Pereira /** 761b807337282fb19d1a38cdbe092a2f472b0e30321Mindy Pereira * Return if this is the trash folder. 762b807337282fb19d1a38cdbe092a2f472b0e30321Mindy Pereira */ 763b807337282fb19d1a38cdbe092a2f472b0e30321Mindy Pereira public boolean isTrash() { 764a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein return isType(FolderType.TRASH); 765b807337282fb19d1a38cdbe092a2f472b0e30321Mindy Pereira } 7660d03ef8793b9abd8b8617931ae163bd0f1ebf346Mindy Pereira 7670d03ef8793b9abd8b8617931ae163bd0f1ebf346Mindy Pereira /** 768ef3625472596326b910a4445307d1a8eb8c9cc3fPaul Westbrook * Return if this is a draft folder. 769ef3625472596326b910a4445307d1a8eb8c9cc3fPaul Westbrook */ 770ef3625472596326b910a4445307d1a8eb8c9cc3fPaul Westbrook public boolean isDraft() { 771a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein return isType(FolderType.DRAFT); 772ef3625472596326b910a4445307d1a8eb8c9cc3fPaul Westbrook } 773ef3625472596326b910a4445307d1a8eb8c9cc3fPaul Westbrook 774ef3625472596326b910a4445307d1a8eb8c9cc3fPaul Westbrook /** 7750d03ef8793b9abd8b8617931ae163bd0f1ebf346Mindy Pereira * Whether this folder supports only showing important messages. 7760d03ef8793b9abd8b8617931ae163bd0f1ebf346Mindy Pereira */ 7770d03ef8793b9abd8b8617931ae163bd0f1ebf346Mindy Pereira public boolean isImportantOnly() { 7780d03ef8793b9abd8b8617931ae163bd0f1ebf346Mindy Pereira return supportsCapability( 7790d03ef8793b9abd8b8617931ae163bd0f1ebf346Mindy Pereira UIProvider.FolderCapabilities.ONLY_IMPORTANT); 7800d03ef8793b9abd8b8617931ae163bd0f1ebf346Mindy Pereira } 781a8492633481c1724d2f6d418594faf6e982d3dc9mindyp 782a8492633481c1724d2f6d418594faf6e982d3dc9mindyp /** 783610210c6dc5c66237b9f1d0d61c7d2fa25a8e6bcAndrew Sapperstein * Return if this is the sent folder. 784610210c6dc5c66237b9f1d0d61c7d2fa25a8e6bcAndrew Sapperstein */ 785610210c6dc5c66237b9f1d0d61c7d2fa25a8e6bcAndrew Sapperstein public boolean isSent() { 786610210c6dc5c66237b9f1d0d61c7d2fa25a8e6bcAndrew Sapperstein return isType(FolderType.SENT); 787610210c6dc5c66237b9f1d0d61c7d2fa25a8e6bcAndrew Sapperstein } 788610210c6dc5c66237b9f1d0d61c7d2fa25a8e6bcAndrew Sapperstein 789610210c6dc5c66237b9f1d0d61c7d2fa25a8e6bcAndrew Sapperstein /** 7908aa5093015236697fb0e6baef4edc8408223145dTony Mantler * Return if this is the outbox folder 7918aa5093015236697fb0e6baef4edc8408223145dTony Mantler */ 7928aa5093015236697fb0e6baef4edc8408223145dTony Mantler public boolean isOutbox() { 7938aa5093015236697fb0e6baef4edc8408223145dTony Mantler return isType(FolderType.OUTBOX); 7948aa5093015236697fb0e6baef4edc8408223145dTony Mantler } 7958aa5093015236697fb0e6baef4edc8408223145dTony Mantler 7968aa5093015236697fb0e6baef4edc8408223145dTony Mantler /** 797a8492633481c1724d2f6d418594faf6e982d3dc9mindyp * Whether this is the special folder just used to display all mail for an account. 798a8492633481c1724d2f6d418594faf6e982d3dc9mindyp */ 799a8492633481c1724d2f6d418594faf6e982d3dc9mindyp public boolean isViewAll() { 800a44b0eda75782a95cbf16e8d14e8080325028657Andrew Sapperstein return isType(FolderType.ALL_MAIL); 801a8492633481c1724d2f6d418594faf6e982d3dc9mindyp } 80241b9e8f7bea47bbcae71b9ae81c3608a00a90e70Vikram Aggarwal 80341b9e8f7bea47bbcae71b9ae81c3608a00a90e70Vikram Aggarwal /** 80410ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux * Return true if this folder prefers to display recipients over senders. 80510ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux */ 80610ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux public boolean shouldShowRecipients() { 80710ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux return supportsCapability(UIProvider.FolderCapabilities.SHOW_RECIPIENTS); 80810ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux } 80910ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux 81010ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux /** 81110ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux * Return true if this folder prefers to display recipients over senders. 81210ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux */ 81310ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux public static boolean shouldShowRecipients(final int folderCapabilities) { 81410ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux return (folderCapabilities & UIProvider.FolderCapabilities.SHOW_RECIPIENTS) != 0; 81510ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux } 81610ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux 81710ea28ab588d8e922c0f78f0f47fe479739ec2cfJames Lemieux /** 818042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang * @return a non-user facing English string describing this folder's type 819042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang */ 820042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang public String getTypeDescription() { 821042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang final String desc; 822042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang if (isType(FolderType.INBOX_SECTION)) { 823e003b4cc4a23e6d394998bebe26430a361c5ac29Andy Huang desc = "inbox_section:" + persistentId; 824042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } else if (isInbox()) { 825e003b4cc4a23e6d394998bebe26430a361c5ac29Andy Huang desc = "inbox:" + persistentId; 826042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } else if (isDraft()) { 827042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang desc = "draft"; 828042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } else if (isImportantOnly()) { 829042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang desc = "important"; 830042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } else if (isType(FolderType.OUTBOX)) { 831042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang desc = "outbox"; 832042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } else if (isType(FolderType.SENT)) { 833042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang desc = "sent"; 834042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } else if (isType(FolderType.SPAM)) { 835042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang desc = "spam"; 836042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } else if (isType(FolderType.STARRED)) { 837042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang desc = "starred"; 838042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } else if (isTrash()) { 839042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang desc = "trash"; 840042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } else if (isType(FolderType.UNREAD)) { 841042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang desc = "unread"; 842a90c33b7db2f47cd1e8129dd8c262e9e3e329f71Andy Huang } else if (isType(FolderType.SEARCH)) { 843a90c33b7db2f47cd1e8129dd8c262e9e3e329f71Andy Huang desc = "search"; 844042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } else if (isViewAll()) { 845042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang desc = "all_mail"; 846042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } else if (isProviderFolder()) { 847e003b4cc4a23e6d394998bebe26430a361c5ac29Andy Huang desc = "other:" + persistentId; 848042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } else { 849042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang desc = "user_folder"; 850042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } 851042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang return desc; 852042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang } 853042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang 854042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang /** 85541b9e8f7bea47bbcae71b9ae81c3608a00a90e70Vikram Aggarwal * True if the previous sync was successful, false otherwise. 85641b9e8f7bea47bbcae71b9ae81c3608a00a90e70Vikram Aggarwal * @return 85741b9e8f7bea47bbcae71b9ae81c3608a00a90e70Vikram Aggarwal */ 85841b9e8f7bea47bbcae71b9ae81c3608a00a90e70Vikram Aggarwal public final boolean wasSyncSuccessful() { 85941b9e8f7bea47bbcae71b9ae81c3608a00a90e70Vikram Aggarwal return ((lastSyncResult & 0x0f) == UIProvider.LastSyncResult.SUCCESS); 86041b9e8f7bea47bbcae71b9ae81c3608a00a90e70Vikram Aggarwal } 8618e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yang 862f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal /** 863f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal * Returns true if unread count should be suppressed for this folder. This is done for folders 864f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal * where the unread count is meaningless: trash or drafts, for instance. 865f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal * @return true if unread count should be suppressed for this object. 866f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal */ 867f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal public final boolean isUnreadCountHidden() { 868f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal return (isDraft() || isTrash() || isType(FolderType.OUTBOX)); 869f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal } 870f18b1173c9624d1e0a8fa37ed15a63e9fe4ccdc8Vikram Aggarwal 87142fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler /** 87242fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler * This method is only used for parsing folders out of legacy intent extras, and only the 87342fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler * folderUri and conversationListUri fields are actually read before the object is discarded. 87442fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler * TODO: replace this with a parsing function that just directly returns those values 87542fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler * @param inString UR8 or earlier EXTRA_FOLDER intent extra string 87642fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler * @return Constructed folder object 87742fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler */ 8788e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yang @Deprecated 8798e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yang public static Folder fromString(String inString) { 88042fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler if (TextUtils.isEmpty(inString)) { 88142fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler return null; 88242fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler } 88342fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler final Folder f = new Folder(); 88442fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler int indexOf = inString.indexOf(SPLITTER); 88542fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler int id = -1; 88642fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler if (indexOf != -1) { 88742fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler id = Integer.valueOf(inString.substring(0, indexOf)); 88842fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler } else { 88942fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler // If no separator was found, we can't parse this folder and the 89042fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler // TextUtils.split call would also fail. Return null. 89142fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler return null; 89242fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler } 89342fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler final String[] split = TextUtils.split(inString, SPLITTER_REGEX); 89442fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler if (split.length < 20) { 89542fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler LogUtils.e(LOG_TAG, "split.length %d", split.length); 89642fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler return null; 89742fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler } 89842fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.id = id; 89942fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler int index = 1; 90042fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.folderUri = new FolderUri(Folder.getValidUri(split[index++])); 90142fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.name = split[index++]; 90242fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.hasChildren = Integer.parseInt(split[index++]) != 0; 90342fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.capabilities = Integer.parseInt(split[index++]); 90442fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.syncWindow = Integer.parseInt(split[index++]); 90542fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.conversationListUri = getValidUri(split[index++]); 90642fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.childFoldersListUri = getValidUri(split[index++]); 90742fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.unreadCount = Integer.parseInt(split[index++]); 90842fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.totalCount = Integer.parseInt(split[index++]); 90942fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.refreshUri = getValidUri(split[index++]); 91042fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.syncStatus = Integer.parseInt(split[index++]); 91142fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.lastSyncResult = Integer.parseInt(split[index++]); 91242fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.type = Integer.parseInt(split[index++]); 91342fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.iconResId = Integer.parseInt(split[index++]); 91442fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.bgColor = split[index++]; 91542fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.fgColor = split[index++]; 91659737eef2716355c4a3ca17fbc8bde497fb6eb32Rohan Shah if (!TextUtils.isEmpty(f.bgColor)) { 91742fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.bgColorInt = Integer.parseInt(f.bgColor); 91842fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler } 91959737eef2716355c4a3ca17fbc8bde497fb6eb32Rohan Shah if (!TextUtils.isEmpty(f.fgColor)) { 92042fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.fgColorInt = Integer.parseInt(f.fgColor); 92142fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler } 92242fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.loadMoreUri = getValidUri(split[index++]); 92342fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.hierarchicalDesc = split[index++]; 92442fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.parent = Folder.getValidUri(split[index++]); 92542fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler f.unreadSenders = null; 92642fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler 92742fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler return f; 92842fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler } 9298e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yang 9308e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yang private static Uri getValidUri(String uri) { 93142fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler if (TextUtils.isEmpty(uri)) { 93242fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler return null; 93342fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler } 93442fe486e9e80a13d7f94573af1000f883a5d9dabTony Mantler return Uri.parse(uri); 9358e99b95bf01c63f733fbd80c28c684350c7d702bAlice Yang } 9369695e0046f79bd2d7166a411d6feff4cf0fb2539Jin Cao 9379695e0046f79bd2d7166a411d6feff4cf0fb2539Jin Cao public static final boolean isRoot(Folder folder) { 9389695e0046f79bd2d7166a411d6feff4cf0fb2539Jin Cao return (folder == null) || Uri.EMPTY.equals(folder.parent); 9399695e0046f79bd2d7166a411d6feff4cf0fb2539Jin Cao } 9404e812f49c5bbba50a60d062d624403952f8d5487Mindy Pereira} 941