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