1bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook/*
2bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Copyright (C) 2010 The Android Open Source Project
3bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *
4bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Licensed under the Apache License, Version 2.0 (the "License");
5bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * you may not use this file except in compliance with the License.
6bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * You may obtain a copy of the License at
7bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *
8bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *      http://www.apache.org/licenses/LICENSE-2.0
9bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *
10bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Unless required by applicable law or agreed to in writing, software
11bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * distributed under the License is distributed on an "AS IS" BASIS,
12bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * See the License for the specific language governing permissions and
14bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * limitations under the License.
15bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook */
16bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
17bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookpackage com.android.email.activity;
18bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
19bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.content.ContentResolver;
20bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.content.ContentUris;
21bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.content.Context;
22bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.content.Loader;
23bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.database.Cursor;
24bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.database.MatrixCursor;
25bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.view.LayoutInflater;
26bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.view.View;
27bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.view.ViewGroup;
28bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.widget.AdapterView;
29bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.widget.CursorAdapter;
30bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.widget.TextView;
31bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
32bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.email.FolderProperties;
33bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.email.R;
34bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.email.ResourceHelper;
35bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.email.data.ClosingMatrixCursor;
36bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.email.data.ThrottlingCursorLoader;
37bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.provider.Account;
38bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.provider.EmailContent;
39bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.provider.EmailContent.AccountColumns;
40bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.provider.EmailContent.MailboxColumns;
41bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.provider.Mailbox;
42bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.utility.Utility;
43bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.google.common.annotations.VisibleForTesting;
44bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.google.common.base.Preconditions;
45bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
46bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.util.ArrayList;
47bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.util.Collection;
48bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
49bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook/**
50bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Account selector spinner.
51bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *
52bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * TODO Test it!
53bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook */
54bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookpublic class AccountSelectorAdapter extends CursorAdapter {
55bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /** meta data column for an message count (unread or total, depending on row) */
56bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static final String MESSAGE_COUNT = "unreadCount";
57bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
58bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /** meta data column for the row type; used for display purposes */
59bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static final String ROW_TYPE = "rowType";
60bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
61bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /** meta data position of the currently selected account in the drop-down list */
62bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static final String ACCOUNT_POSITION = "accountPosition";
63bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
64bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /** "account id" virtual column name for the matrix cursor */
65bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static final String ACCOUNT_ID = "accountId";
66bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
67bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static final int ROW_TYPE_HEADER = AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
68bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    @SuppressWarnings("unused")
69bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static final int ROW_TYPE_MAILBOX = 0;
70bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static final int ROW_TYPE_ACCOUNT = 1;
71bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static final int ITEM_VIEW_TYPE_ACCOUNT = 0;
72bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    static final int UNKNOWN_POSITION = -1;
73bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /** Projection for account database query */
74bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static final String[] ACCOUNT_PROJECTION = new String[] {
75bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        EmailContent.RECORD_ID,
76bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        Account.DISPLAY_NAME,
77bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        Account.EMAIL_ADDRESS,
78bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    };
79bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
80bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Projection used for the selector display; we add meta data that doesn't exist in the
81bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * account database, so, this should be a super-set of {@link #ACCOUNT_PROJECTION}.
82bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
83bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static final String[] ADAPTER_PROJECTION = new String[] {
84bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        ROW_TYPE,
85bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        EmailContent.RECORD_ID,
86bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        Account.DISPLAY_NAME,
87bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        Account.EMAIL_ADDRESS,
88bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        MESSAGE_COUNT,
89bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        ACCOUNT_POSITION, // TODO Probably we don't really need this
90bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        ACCOUNT_ID,
91bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    };
92bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
93bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /** Sort order.  Show the default account first. */
94bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static final String ORDER_BY = Account.IS_DEFAULT + " desc, " + Account.RECORD_ID;
95bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
96bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    @SuppressWarnings("hiding")
97bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private final Context mContext;
98bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private final LayoutInflater mInflater;
99bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private final ResourceHelper mResourceHelper;
100bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
101bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
102bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Returns a loader that can populate the account spinner.
103bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param context a context
104bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param accountId the ID of the currently viewed account
105bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
106bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static Loader<Cursor> createLoader(Context context, long accountId, long mailboxId) {
107bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return new AccountsLoader(context, accountId, mailboxId, UiUtilities.useTwoPane(context));
108bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
109bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
110bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public AccountSelectorAdapter(Context context) {
111bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        super(context, null, 0 /* no auto-requery */);
112bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        mContext = context;
113bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        mInflater = LayoutInflater.from(context);
114bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        mResourceHelper = ResourceHelper.getInstance(context);
115bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
116bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
117bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
118bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * {@inheritDoc}
119bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
120bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * The account selector view can contain one of four types of row data:
121bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <ol>
122bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <li>headers</li>
123bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <li>accounts</li>
124bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <li>recent mailboxes</li>
125bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <li>"show all folders"</li>
126bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * </ol>
127bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Headers are handled separately as they have a unique layout and cannot be interacted with.
128bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Accounts, recent mailboxes and "show all folders" all have the same interaction model and
129bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * share a very similar layout. The single difference is that both accounts and recent
130bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * mailboxes display an unread count; whereas "show all folders" does not. To determine
131bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * if a particular row is "show all folders" verify that a) it's not an account row and
132bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * b) it's ID is {@link Mailbox#NO_MAILBOX}.
133bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
134bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * TODO Use recycled views.  ({@link #getViewTypeCount} and {@link #getItemViewType})
135bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
136bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    @Override
137bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public View getView(int position, View convertView, ViewGroup parent) {
138bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        Cursor c = getCursor();
139bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        c.moveToPosition(position);
140bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        View view;
141bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (c.getInt(c.getColumnIndex(ROW_TYPE)) == ROW_TYPE_HEADER) {
142bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            view = mInflater.inflate(R.layout.action_bar_spinner_dropdown_header, parent, false);
143bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final TextView displayNameView = (TextView) view.findViewById(R.id.display_name);
144bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final String displayName = getDisplayName(c);
145bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            displayNameView.setText(displayName);
146bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        } else {
147bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            view = mInflater.inflate(R.layout.action_bar_spinner_dropdown, parent, false);
148bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final TextView displayNameView = (TextView) view.findViewById(R.id.display_name);
149bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final TextView emailAddressView = (TextView) view.findViewById(R.id.email_address);
150bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final TextView unreadCountView = (TextView) view.findViewById(R.id.unread_count);
151bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final View chipView = view.findViewById(R.id.color_chip);
152bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
153bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final String displayName = getDisplayName(c);
154bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final String emailAddress = getAccountEmailAddress(c);
155bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
156bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            displayNameView.setText(displayName);
157bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
158bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // Show the email address only when it's different from the display name.
159bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            boolean isAccount = isAccountItem(c);
160bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (displayName.equals(emailAddress) || !isAccount) {
161bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                emailAddressView.setVisibility(View.GONE);
162bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            } else {
163bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                emailAddressView.setVisibility(View.VISIBLE);
164bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                emailAddressView.setText(emailAddress);
165bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
166bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
167bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            long id = getId(c);
168bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (isAccount || id != Mailbox.NO_MAILBOX) {
169bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                unreadCountView.setVisibility(View.VISIBLE);
170bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                unreadCountView.setText(UiUtilities.getMessageCountForUi(mContext,
171bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                        getAccountUnreadCount(c), true));
172bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
173bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                // If we're on a combined account, show the color chip indicators for all real
174bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                // accounts so it can be used as a legend.
175bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                boolean isCombinedActive =
176bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                        ((CursorWithExtras) c).getAccountId() == Account.ACCOUNT_ID_COMBINED_VIEW;
177bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
178bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                if (isCombinedActive && Account.isNormalAccount(id)) {
179bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    chipView.setBackgroundColor(mResourceHelper.getAccountColor(id));
180bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    chipView.setVisibility(View.VISIBLE);
181bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                } else {
182bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    chipView.setVisibility(View.GONE);
183bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                }
184bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            } else {
185bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                unreadCountView.setVisibility(View.INVISIBLE);
186bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                chipView.setVisibility(View.GONE);
187bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
188bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
189bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
190bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return view;
191bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
192bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
193bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    @Override
194bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public View newView(Context context, Cursor cursor, ViewGroup parent) {
195bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return null; // we don't reuse views.  This method never gets called.
196bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
197bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
198bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    @Override
199bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public void bindView(View view, Context context, Cursor cursor) {
200bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        // we don't reuse views.  This method never gets called.
201bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
202bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
203bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    @Override
204bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public int getViewTypeCount() {
205bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return 2;
206bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
207bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
208bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    @Override
209bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public int getItemViewType(int position) {
210bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        Cursor c = getCursor();
211bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        c.moveToPosition(position);
212bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return c.getLong(c.getColumnIndex(ROW_TYPE)) == ROW_TYPE_HEADER
213bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                ? AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER
214bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                : ITEM_VIEW_TYPE_ACCOUNT;
215bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
216bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
217bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    @Override
218bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public boolean areAllItemsEnabled() {
219bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return false;
220bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
221bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
222bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    @Override
223bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public boolean isEnabled(int position) {
224bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return (getItemViewType(position) != AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER);
225bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
226bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
227bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public boolean isAccountItem(int position) {
228bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        Cursor c = getCursor();
229bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        c.moveToPosition(position);
230bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return isAccountItem(c);
231bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
232bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
233bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public boolean isAccountItem(Cursor c) {
234bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return (c.getLong(c.getColumnIndex(ROW_TYPE)) == ROW_TYPE_ACCOUNT);
235bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
236bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
237bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public boolean isMailboxItem(int position) {
238bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        Cursor c = getCursor();
239bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        c.moveToPosition(position);
240bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return (c.getLong(c.getColumnIndex(ROW_TYPE)) == ROW_TYPE_MAILBOX);
241bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
242bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
243bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private int getAccountUnreadCount(Cursor c) {
244bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return getMessageCount(c);
245bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
246bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
247bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
248bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Returns the account/mailbox ID extracted from the given cursor.
249bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
250bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static long getId(Cursor c) {
251bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return c.getLong(c.getColumnIndex(EmailContent.RECORD_ID));
252bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
253bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
254bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
255bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return ID of the account / mailbox for a row
256bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
257bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public long getId(int position) {
258bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        final Cursor c = getCursor();
259bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return c.moveToPosition(position) ? getId(c) : Account.NO_ACCOUNT;
260bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
261bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
262bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
263bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @return ID of the account for a row
264bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
265bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public long getAccountId(int position) {
266bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        final Cursor c = getCursor();
267bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return c.moveToPosition(position)
268bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                ? c.getLong(c.getColumnIndex(ACCOUNT_ID))
269bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                : Account.NO_ACCOUNT;
270bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
271bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
272bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /** Returns the account name extracted from the given cursor. */
273bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    static String getDisplayName(Cursor cursor) {
274bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return cursor.getString(cursor.getColumnIndex(Account.DISPLAY_NAME));
275bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
276bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
277bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /** Returns the email address extracted from the given cursor. */
278bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static String getAccountEmailAddress(Cursor cursor) {
279bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return cursor.getString(cursor.getColumnIndex(Account.EMAIL_ADDRESS));
280bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
281bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
282bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
283bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Returns the message count (unread or total, depending on row) extracted from the given
284bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * cursor.
285bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
286bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static int getMessageCount(Cursor cursor) {
287bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return cursor.getInt(cursor.getColumnIndex(MESSAGE_COUNT));
288bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
289bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
290bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static String sCombinedViewDisplayName;
291bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private static String getCombinedViewDisplayName(Context c) {
292bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (sCombinedViewDisplayName == null) {
293bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            sCombinedViewDisplayName = c.getResources().getString(
294bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    R.string.mailbox_list_account_selector_combined_view);
295bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
296bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return sCombinedViewDisplayName;
297bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
298bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
299bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /**
300bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Load the account list.  The resulting cursor contains
301bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * - Account info
302bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * - # of unread messages in inbox
303bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * - The "Combined view" row if there's more than one account.
304bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     */
305bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    @VisibleForTesting
306bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    static class AccountsLoader extends ThrottlingCursorLoader {
307bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private final Context mContext;
308bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private final long mAccountId;
309bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private final long mMailboxId;
310bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private final boolean mUseTwoPane; // Injectable for test
311bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private final FolderProperties mFolderProperties;
312bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
313bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        @VisibleForTesting
314bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        AccountsLoader(Context context, long accountId, long mailboxId, boolean useTwoPane) {
315bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // Super class loads a regular account cursor, but we replace it in loadInBackground().
316bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            super(context, Account.CONTENT_URI, ACCOUNT_PROJECTION, null, null,
317bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    ORDER_BY);
318bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mContext = context;
319bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mAccountId = accountId;
320bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mMailboxId = mailboxId;
321bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mFolderProperties = FolderProperties.getInstance(mContext);
322bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mUseTwoPane = useTwoPane;
323bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
324bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
325bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        @Override
326bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public Cursor loadInBackground() {
327bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final Cursor accountsCursor = super.loadInBackground();
328bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // Use ClosingMatrixCursor so that accountsCursor gets closed too when it's closed.
329bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final CursorWithExtras resultCursor
330bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    = new CursorWithExtras(ADAPTER_PROJECTION, accountsCursor);
331bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final int accountPosition = addAccountsToCursor(resultCursor, accountsCursor);
332bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            addMailboxesToCursor(resultCursor, accountPosition);
333bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
334bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            resultCursor.setAccountMailboxInfo(getContext(), mAccountId, mMailboxId);
335bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return resultCursor;
336bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
337bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
338bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        /** Adds the account list [with extra meta data] to the given matrix cursor */
339bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private int addAccountsToCursor(CursorWithExtras matrixCursor, Cursor accountCursor) {
340bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            int accountPosition = UNKNOWN_POSITION;
341bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            accountCursor.moveToPosition(-1);
342bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
343bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            matrixCursor.mAccountCount = accountCursor.getCount();
344bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            int totalUnread = 0;
345bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            while (accountCursor.moveToNext()) {
346bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                // Add account, with its unread count.
347bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                final long accountId = accountCursor.getLong(0);
348bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                final int unread = Mailbox.getUnreadCountByAccountAndMailboxType(
349bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                        mContext, accountId, Mailbox.TYPE_INBOX);
350bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                final String name = getDisplayName(accountCursor);
351bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                final String emailAddress = getAccountEmailAddress(accountCursor);
352bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                addRow(matrixCursor, ROW_TYPE_ACCOUNT, accountId, name, emailAddress, unread,
353bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    UNKNOWN_POSITION, accountId);
354bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                totalUnread += unread;
355bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                if (accountId == mAccountId) {
356bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    accountPosition = accountCursor.getPosition();
357bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                }
358bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
359bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // Add "combined view" if more than one account exists
360bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final int countAccounts = accountCursor.getCount();
361bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (countAccounts > 1) {
362bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                final String accountCount = mContext.getResources().getQuantityString(
363bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                        R.plurals.number_of_accounts, countAccounts, countAccounts);
364bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                addRow(matrixCursor, ROW_TYPE_ACCOUNT, Account.ACCOUNT_ID_COMBINED_VIEW,
365bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                        getCombinedViewDisplayName(mContext),
366bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                        accountCount, totalUnread, UNKNOWN_POSITION,
367bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                        Account.ACCOUNT_ID_COMBINED_VIEW);
368bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
369bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                // Increment the account count for the combined account.
370bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                matrixCursor.mAccountCount++;
371bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
372bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return accountPosition;
373bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
374bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
375bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        /**
376bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         * Adds the recent mailbox list / "show all folders" to the given cursor.
377bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         *
378bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         * @param matrixCursor the cursor to add the list to
379bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         * @param accountPosition the cursor position of the currently selected account
380bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         */
381bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private void addMailboxesToCursor(CursorWithExtras matrixCursor, int accountPosition) {
382bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (mAccountId == Account.NO_ACCOUNT) {
383bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                return; // Account not selected
384bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
385bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (mAccountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
386bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                if (!mUseTwoPane) {
387bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    // TODO We may want a header for this to separate it from the account list
388bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    addShowAllFoldersRow(matrixCursor, accountPosition);
389bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                }
390bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                return;
391bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
392bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            String emailAddress = null;
393bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (accountPosition != UNKNOWN_POSITION) {
394bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                matrixCursor.moveToPosition(accountPosition);
395bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                emailAddress =
396bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                        matrixCursor.getString(matrixCursor.getColumnIndex(Account.EMAIL_ADDRESS));
397bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
398bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            RecentMailboxManager mailboxManager = RecentMailboxManager.getInstance(mContext);
399bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            ArrayList<Long> recentMailboxes = null;
400bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (!mUseTwoPane) {
401bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                // Do not display recent mailboxes in the account spinner for the two pane view
402bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                recentMailboxes = mailboxManager.getMostRecent(mAccountId, mUseTwoPane);
403bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
404bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final int recentCount = (recentMailboxes == null) ? 0 : recentMailboxes.size();
405bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            matrixCursor.mRecentCount = recentCount;
406bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
407bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (!mUseTwoPane) {
408bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                // "Recent mailboxes" header
409bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                addHeaderRow(matrixCursor, mContext.getString(
410bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                        R.string.mailbox_list_account_selector_mailbox_header_fmt, emailAddress));
411bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
412bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
413bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (recentCount > 0) {
414bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                addMailboxRows(matrixCursor, accountPosition, recentMailboxes);
415bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
416bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
417bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (!mUseTwoPane) {
418bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                addShowAllFoldersRow(matrixCursor, accountPosition);
419bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
420bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
421bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
422bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private void addShowAllFoldersRow(CursorWithExtras matrixCursor, int accountPosition) {
423bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            matrixCursor.mHasShowAllFolders = true;
424bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            String name = mContext.getString(
425bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    R.string.mailbox_list_account_selector_show_all_folders);
426bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            addRow(matrixCursor, ROW_TYPE_MAILBOX, Mailbox.NO_MAILBOX, name, null, 0,
427bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    accountPosition, mAccountId);
428bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
429bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
430bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
431bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private static final String[] RECENT_MAILBOX_INFO_PROJECTION = new String[] {
432bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            MailboxColumns.ID, MailboxColumns.DISPLAY_NAME, MailboxColumns.TYPE,
433bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT
434bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        };
435bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
436bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private void addMailboxRows(MatrixCursor matrixCursor, int accountPosition,
437bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                Collection<Long> mailboxIds) {
438bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            Cursor c = mContext.getContentResolver().query(
439bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    Mailbox.CONTENT_URI, RECENT_MAILBOX_INFO_PROJECTION,
440bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    Utility.buildInSelection(MailboxColumns.ID, mailboxIds), null,
441bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    RecentMailboxManager.RECENT_MAILBOXES_SORT_ORDER);
442bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            try {
443bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                c.moveToPosition(-1);
444bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                while (c.moveToNext()) {
445bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    addRow(matrixCursor, ROW_TYPE_MAILBOX,
446bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                            c.getLong(c.getColumnIndex(MailboxColumns.ID)),
447bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                            mFolderProperties.getDisplayName(c), null,
448bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                            mFolderProperties.getMessageCount(c), accountPosition, mAccountId);
449bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                }
450bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            } finally {
451bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                c.close();
452bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
453bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
454bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
455bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private void addHeaderRow(MatrixCursor cursor, String name) {
456bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            addRow(cursor, ROW_TYPE_HEADER, 0L, name, null, 0, UNKNOWN_POSITION,
457bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    Account.NO_ACCOUNT);
458bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
459bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
460bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        /** Adds a row to the given cursor */
461bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private void addRow(MatrixCursor cursor, int rowType, long id, String name,
462bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                String emailAddress, int messageCount, int listPosition, long accountId) {
463bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            cursor.newRow()
464bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                .add(rowType)
465bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                .add(id)
466bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                .add(name)
467bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                .add(emailAddress)
468bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                .add(messageCount)
469bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                .add(listPosition)
470bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                .add(accountId);
471bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
472bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
473bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
474bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    /** Cursor with some extra meta data. */
475bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    static class CursorWithExtras extends ClosingMatrixCursor {
476bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
477bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        /** Number of account elements, including the combined account row. */
478bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private int mAccountCount;
479bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        /** Number of recent mailbox elements */
480bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private int mRecentCount;
481bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private boolean mHasShowAllFolders;
482bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
483bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private boolean mAccountExists;
484bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
485bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        /**
486bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         * Account ID that's loaded.
487bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         */
488bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private long mAccountId;
489bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private String mAccountDisplayName;
490bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
491bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        /**
492bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         * Mailbox ID that's loaded.
493bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         */
494bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private long mMailboxId;
495bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private String mMailboxDisplayName;
496bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private int mMailboxMessageCount;
497bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
498bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        @VisibleForTesting
499bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        CursorWithExtras(String[] columnNames, Cursor innerCursor) {
500bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            super(columnNames, innerCursor);
501bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
502bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
503bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private static final String[] ACCOUNT_INFO_PROJECTION = new String[] {
504bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            AccountColumns.DISPLAY_NAME,
505bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        };
506bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private static final String[] MAILBOX_INFO_PROJECTION = new String[] {
507bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            MailboxColumns.ID, MailboxColumns.DISPLAY_NAME, MailboxColumns.TYPE,
508bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT
509bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        };
510bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
511bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        /**
512bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         * Set the current account/mailbox info.
513bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         */
514bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        @VisibleForTesting
515bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        void setAccountMailboxInfo(Context context, long accountId, long mailboxId) {
516bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mAccountId = accountId;
517bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mMailboxId = mailboxId;
518bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
519bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // Get account info
520bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
521bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                // We need to treat ACCOUNT_ID_COMBINED_VIEW specially...
522bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                mAccountExists = true;
523bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                mAccountDisplayName = getCombinedViewDisplayName(context);
524bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                if (mailboxId != Mailbox.NO_MAILBOX) {
525bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    setCombinedMailboxInfo(context, mailboxId);
526bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                }
527bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                return;
528bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
529bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
530bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mAccountDisplayName = Utility.getFirstRowString(context,
531bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    ContentUris.withAppendedId(Account.CONTENT_URI, accountId),
532bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    ACCOUNT_INFO_PROJECTION, null, null, null, 0, null);
533bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (mAccountDisplayName == null) {
534bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                // Account gone!
535bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                mAccountExists = false;
536bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                return;
537bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
538bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mAccountExists = true;
539bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
540bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // If mailbox not specified, done.
541bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (mMailboxId == Mailbox.NO_MAILBOX) {
542bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                return;
543bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
544bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // Combined mailbox?
545bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // Unfortunately this can happen even when account != ACCOUNT_ID_COMBINED_VIEW,
546bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // when you open "starred" on 2-pane on non-combined view.
547bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            if (mMailboxId < 0) {
548bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                setCombinedMailboxInfo(context, mailboxId);
549bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                return;
550bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
551bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
552bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            // Get mailbox info
553bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final ContentResolver r = context.getContentResolver();
554bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            final Cursor mailboxCursor = r.query(
555bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
556bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    MAILBOX_INFO_PROJECTION, null, null, null);
557bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            try {
558bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                if (mailboxCursor.moveToFirst()) {
559bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    final FolderProperties fp = FolderProperties.getInstance(context);
560bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    mMailboxDisplayName = fp.getDisplayName(mailboxCursor);
561bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    mMailboxMessageCount = fp.getMessageCount(mailboxCursor);
562bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                }
563bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            } finally {
564bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                mailboxCursor.close();
565bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
566bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
567bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
568bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        private void setCombinedMailboxInfo(Context context, long mailboxId) {
569bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            Preconditions.checkState(mailboxId < -1, "Not combined mailbox");
570bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mMailboxDisplayName = FolderProperties.getInstance(context)
571bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    .getCombinedMailboxName(mMailboxId);
572bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
573bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            mMailboxMessageCount = FolderProperties.getMessageCountForCombinedMailbox(
574bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    context, mailboxId);
575bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
576bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
577bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        /**
578bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         * Returns the cursor position of the item with the given ID. Or {@link #UNKNOWN_POSITION}
579bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         * if the given ID does not exist.
580bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         */
581bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        int getPosition(long id) {
582bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            moveToPosition(-1);
583bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            while(moveToNext()) {
584bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                if (id == getId(this)) {
585bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    return getPosition();
586bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                }
587bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            }
588bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return UNKNOWN_POSITION;
589bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
590bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
591bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public int getAccountCount() {
592bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return mAccountCount;
593bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
594bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
595bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        @VisibleForTesting
596bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public int getRecentMailboxCount() {
597bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return mRecentCount;
598bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
599bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
600bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        /**
601bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         * @return true if the cursor has more than one selectable item so we should enable the
602bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         *     spinner.
603bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         */
604bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public boolean shouldEnableSpinner() {
605bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return mHasShowAllFolders || (mAccountCount + mRecentCount > 1);
606bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
607bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
608bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public long getAccountId() {
609bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return mAccountId;
610bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
611bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
612bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public String getAccountDisplayName() {
613bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return mAccountDisplayName;
614bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
615bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
616bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        @VisibleForTesting
617bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public long getMailboxId() {
618bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return mMailboxId;
619bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
620bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
621bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public String getMailboxDisplayName() {
622bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return mMailboxDisplayName;
623bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
624bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
625bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public int getMailboxMessageCount() {
626bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return mMailboxMessageCount;
627bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
628bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
629bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        /**
630bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         * @return {@code true} if the specified accuont exists.
631bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook         */
632bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public boolean accountExists() {
633bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return mAccountExists;
634bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
635bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
636bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook}
637