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