1bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook/* 2bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Copyright (C) 2011 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 com.android.email.R; 20bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.provider.Account; 21bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.provider.EmailContent.AccountColumns; 22bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.provider.EmailContent.MailboxColumns; 23bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.provider.HostAuth; 24bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport com.android.emailcommon.provider.Mailbox; 25bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 26bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.app.Activity; 27bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.app.FragmentTransaction; 28bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.app.ListFragment; 29bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.app.LoaderManager.LoaderCallbacks; 30bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.content.ContentValues; 31bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.content.Context; 32bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.content.CursorLoader; 33bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.content.Loader; 34bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.content.res.Resources; 35bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.database.Cursor; 36bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.database.MatrixCursor; 37bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.database.MatrixCursor.RowBuilder; 38bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.database.MergeCursor; 39bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.net.Uri; 40bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.os.Bundle; 41bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.view.View; 42bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.widget.AdapterView; 43bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.widget.AdapterView.OnItemClickListener; 44bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.widget.ListView; 45bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport android.widget.SimpleCursorAdapter; 46bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 47bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook/** 48bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Fragment containing a list of accounts to show during shortcut creation. 49bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * <p> 50bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * NOTE: In order to receive callbacks, the activity containing this fragment must implement 51bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * the {@link PickerCallback} interface. 52bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook */ 53bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookpublic abstract class ShortcutPickerFragment extends ListFragment 54bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook implements OnItemClickListener, LoaderCallbacks<Cursor> { 55bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Callback methods. Enclosing activities must implement to receive fragment notifications. */ 56bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public static interface PickerCallback { 57bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Builds a mailbox filter for the given account. See MailboxShortcutPickerFragment. */ 58bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public Integer buildFilter(Account account); 59bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Invoked when an account and mailbox have been selected. */ 60bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onSelected(Account account, long mailboxId); 61bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Required data is missing; either the account and/or mailbox */ 62bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onMissingData(boolean missingAccount, boolean missingMailbox); 63bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 64bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 65bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** A no-op callback */ 66bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final PickerCallback EMPTY_CALLBACK = new PickerCallback() { 67bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override public Integer buildFilter(Account account) { return null; } 68bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override public void onSelected(Account account, long mailboxId){ getActivity().finish(); } 69bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override public void onMissingData(boolean missingAccount, boolean missingMailbox) { } 70bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }; 71bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final static int LOADER_ID = 0; 72bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final static int[] TO_VIEWS = new int[] { 73bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook android.R.id.text1, 74bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }; 75bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 76bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook PickerCallback mCallback = EMPTY_CALLBACK; 77bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Cursor adapter that provides either the account or mailbox list */ 78bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private SimpleCursorAdapter mAdapter; 79bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 80bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 81bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onAttach(Activity activity) { 82bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super.onAttach(activity); 83bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 84bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (activity instanceof PickerCallback) { 85bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mCallback = (PickerCallback) activity; 86bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 87bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook final String[] fromColumns = getFromColumns(); 88bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAdapter = new SimpleCursorAdapter(activity, 89bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook android.R.layout.simple_expandable_list_item_1, null, fromColumns, TO_VIEWS, 0); 90bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook setListAdapter(mAdapter); 91bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 92bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook getLoaderManager().initLoader(LOADER_ID, null, this); 93bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 94bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 95bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 96bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onActivityCreated(Bundle savedInstanceState) { 97bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super.onActivityCreated(savedInstanceState); 98bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 99bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook ListView listView = getListView(); 100bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook listView.setOnItemClickListener(this); 101bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook listView.setItemsCanFocus(false); 102bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 103bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 104bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 105bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 106bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAdapter.swapCursor(data); 107bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 108bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 109bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 110bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onLoaderReset(Loader<Cursor> loader) { 111bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAdapter.swapCursor(null); 112bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 113bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 114bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Returns the cursor columns to map into list */ 115bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook abstract String[] getFromColumns(); 116bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 117bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // TODO if we add meta-accounts to the database, remove this class entirely 118bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private static final class AccountPickerLoader extends CursorLoader { 119bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public AccountPickerLoader(Context context, Uri uri, String[] projection, String selection, 120bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook String[] selectionArgs, String sortOrder) { 121bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super(context, uri, projection, selection, selectionArgs, sortOrder); 122bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 123bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 124bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 125bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public Cursor loadInBackground() { 126bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Cursor parentCursor = super.loadInBackground(); 127bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook int cursorCount = parentCursor.getCount(); 128bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook final Cursor returnCursor; 129bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 130bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (cursorCount > 1) { 131bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Only add "All accounts" if there is more than 1 account defined 132bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook MatrixCursor allAccountCursor = new MatrixCursor(getProjection()); 133bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook addCombinedAccountRow(allAccountCursor, cursorCount); 134bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook returnCursor = new MergeCursor(new Cursor[] { allAccountCursor, parentCursor }); 135bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } else { 136bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook returnCursor = parentCursor; 137bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 138bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return returnCursor; 139bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 140bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 141bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Adds a row for "All Accounts" into the given cursor */ 142bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private void addCombinedAccountRow(MatrixCursor cursor, int accountCount) { 143bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Context context = getContext(); 144bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Account account = new Account(); 145bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook account.mId = Account.ACCOUNT_ID_COMBINED_VIEW; 146bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Resources res = context.getResources(); 147bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook String countString = res.getQuantityString(R.plurals.picker_combined_view_account_count, 148bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook accountCount, accountCount); 149bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook account.mDisplayName = res.getString(R.string.picker_combined_view_fmt, countString); 150bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook ContentValues values = account.toContentValues(); 151bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook RowBuilder row = cursor.newRow(); 152bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook for (String rowName : cursor.getColumnNames()) { 153bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // special case some of the rows ... 154bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (AccountColumns.ID.equals(rowName)) { 155bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook row.add(Account.ACCOUNT_ID_COMBINED_VIEW); 156bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook continue; 157bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } else if (AccountColumns.IS_DEFAULT.equals(rowName)) { 158bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook row.add(0); 159bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook continue; 160bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 161bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook row.add(values.get(rowName)); 162bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 163bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 164bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 165bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 166bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Account picker */ 167bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public static class AccountShortcutPickerFragment extends ShortcutPickerFragment { 168bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private volatile Boolean mLoadFinished = new Boolean(false); 169bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final static String[] ACCOUNT_FROM_COLUMNS = new String[] { 170bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook AccountColumns.DISPLAY_NAME, 171bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }; 172bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 173bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 174bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onActivityCreated(Bundle savedInstanceState) { 175bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super.onActivityCreated(savedInstanceState); 176bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook getActivity().setTitle(R.string.account_shortcut_picker_title); 177bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (!mLoadFinished) { 178bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook getActivity().setVisible(false); 179bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 180bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 181bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 182bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 183bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 184bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Cursor cursor = (Cursor) parent.getItemAtPosition(position); 185bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook selectAccountCursor(cursor, true); 186bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 187bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 188bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 189bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public Loader<Cursor> onCreateLoader(int id, Bundle args) { 190bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Context context = getActivity(); 191bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return new AccountPickerLoader( 192bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook context, Account.CONTENT_URI, Account.CONTENT_PROJECTION, null, null, null); 193bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 194bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 195bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 196bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 197bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // if there is only one account, auto-select it 198bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // No accounts; close the dialog 199bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (data.getCount() == 0) { 200bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mCallback.onMissingData(true, false); 201bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return; 202bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 203bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (data.getCount() == 1 && data.moveToFirst()) { 204bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook selectAccountCursor(data, false); 205bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return; 206bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 207bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super.onLoadFinished(loader, data); 208bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mLoadFinished = true; 209bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook getActivity().setVisible(true); 210bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 211bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 212bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 213bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook String[] getFromColumns() { 214bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return ACCOUNT_FROM_COLUMNS; 215bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 216bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 217bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Selects the account specified by the given cursor */ 218bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private void selectAccountCursor(Cursor cursor, boolean allowBack) { 219bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Account account = new Account(); 220bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook account.restore(cursor); 221bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook ShortcutPickerFragment fragment = MailboxShortcutPickerFragment.newInstance( 222bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook getActivity(), account, mCallback.buildFilter(account)); 223bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook FragmentTransaction transaction = getFragmentManager().beginTransaction(); 224bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook transaction.replace(R.id.shortcut_list, fragment); 225bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (allowBack) { 226bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook transaction.addToBackStack(null); 227bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 228bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook transaction.commitAllowingStateLoss(); 229bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 230bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 231bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 232bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // TODO if we add meta-mailboxes to the database, remove this class entirely 233bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private static final class MailboxPickerLoader extends CursorLoader { 234bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final long mAccountId; 235bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final boolean mAllowUnread; 236bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public MailboxPickerLoader(Context context, Uri uri, String[] projection, String selection, 237bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook String[] selectionArgs, String sortOrder, long accountId, boolean allowUnread) { 238bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super(context, uri, projection, selection, selectionArgs, sortOrder); 239bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccountId = accountId; 240bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAllowUnread = allowUnread; 241bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 242bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 243bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 244bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public Cursor loadInBackground() { 245bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook MatrixCursor unreadCursor = 246bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook new MatrixCursor(MailboxShortcutPickerFragment.MATRIX_PROJECTION); 247bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Context context = getContext(); 248bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (mAllowUnread) { 249bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // For the special mailboxes, their ID is < 0. The UI list does not deal with 250bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // negative values very well, so, add MAX_VALUE to ensure they're positive, but, 251bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // don't clash with legitimate mailboxes. 252bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook String mailboxName = context.getString(R.string.picker_mailbox_name_all_unread); 253bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook unreadCursor.addRow( 254bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook new Object[] { 255bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Integer.MAX_VALUE + Mailbox.QUERY_ALL_UNREAD, 256bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Mailbox.QUERY_ALL_UNREAD, 257bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mailboxName, 258bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }); 259bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 260bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 261bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (mAccountId == Account.ACCOUNT_ID_COMBINED_VIEW) { 262bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Do something special for the "combined" view 263bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook MatrixCursor combinedMailboxesCursor = 264bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook new MatrixCursor(MailboxShortcutPickerFragment.MATRIX_PROJECTION); 265bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // For the special mailboxes, their ID is < 0. The UI list does not deal with 266bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // negative values very well, so, add MAX_VALUE to ensure they're positive, but, 267bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // don't clash with legitimate mailboxes. 268bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook String mailboxName = context.getString(R.string.picker_mailbox_name_all_inbox); 269bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook combinedMailboxesCursor.addRow( 270bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook new Object[] { 271bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Integer.MAX_VALUE + Mailbox.QUERY_ALL_INBOXES, 272bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Mailbox.QUERY_ALL_INBOXES, 273bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mailboxName 274bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }); 275bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return new MergeCursor(new Cursor[] { combinedMailboxesCursor, unreadCursor }); 276bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 277bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 278bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Loading for a regular account; perform a normal load 279bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return new MergeCursor(new Cursor[] { super.loadInBackground(), unreadCursor }); 280bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 281bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 282bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 283bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Mailbox picker */ 284bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public static class MailboxShortcutPickerFragment extends ShortcutPickerFragment { 285bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Allow all mailboxes in the mailbox list */ 286bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public static int FILTER_ALLOW_ALL = 0; 287bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Only allow an account's INBOX */ 288bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public static int FILTER_INBOX_ONLY = 1 << 0; 289bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Allow an "unread" mailbox; this is not affected by {@link #FILTER_INBOX_ONLY} */ 290bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public static int FILTER_ALLOW_UNREAD = 1 << 1; 291bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Fragment argument to set filter values */ 292bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook static final String ARG_FILTER = "MailboxShortcutPickerFragment.filter"; 293bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook static final String ARG_ACCOUNT = "MailboxShortcutPickerFragment.account"; 294bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 295bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final static String REAL_ID = "realId"; 296bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final static String[] MAILBOX_FROM_COLUMNS = new String[] { 297bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook MailboxColumns.DISPLAY_NAME, 298bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }; 299bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Loader projection used for IMAP & POP3 accounts */ 300bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final static String[] IMAP_PROJECTION = new String [] { 301bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook MailboxColumns.ID, MailboxColumns.ID + " as " + REAL_ID, 302bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook MailboxColumns.SERVER_ID + " as " + MailboxColumns.DISPLAY_NAME 303bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }; 304bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Loader projection used for EAS accounts */ 305bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final static String[] EAS_PROJECTION = new String [] { 306bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook MailboxColumns.ID, MailboxColumns.ID + " as " + REAL_ID, 307bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook MailboxColumns.DISPLAY_NAME 308bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }; 309bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Loader projection used for a matrix cursor */ 310bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final static String[] MATRIX_PROJECTION = new String [] { 311bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook MailboxColumns.ID, REAL_ID, MailboxColumns.DISPLAY_NAME 312bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook }; 313bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // TODO #ALL_MAILBOX_SELECTION is identical to MailboxesAdapter#ALL_MAILBOX_SELECTION; 314bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // create a common selection. Move this to the Mailbox class? 315bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Selection for all visible mailboxes for an account */ 316bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final static String ALL_MAILBOX_SELECTION = MailboxColumns.ACCOUNT_KEY + "=?" + 317bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook " AND " + Mailbox.USER_VISIBLE_MAILBOX_SELECTION; 318bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Selection for just the INBOX of an account */ 319bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private final static String INBOX_ONLY_SELECTION = ALL_MAILBOX_SELECTION + 320bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook " AND " + MailboxColumns.TYPE + " = " + Mailbox.TYPE_INBOX; 321bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private volatile Boolean mLoadFinished = new Boolean(false); 322bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** The currently selected account */ 323bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private Account mAccount; 324bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** The filter values; default to allow all mailboxes */ 325bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook private Integer mFilter; 326bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 327bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** 328bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Builds a mailbox shortcut picker for the given account. 329bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook */ 330bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public static MailboxShortcutPickerFragment newInstance( 331bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Context context, Account account, Integer filter) { 332bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 333bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook MailboxShortcutPickerFragment fragment = new MailboxShortcutPickerFragment(); 334bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Bundle args = new Bundle(); 335bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook args.putParcelable(ARG_ACCOUNT, account); 336bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook args.putInt(ARG_FILTER, filter); 337bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook fragment.setArguments(args); 338bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return fragment; 339bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 340bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 341bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook /** Returns the mailbox filter */ 342bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook int getFilter() { 343bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (mFilter == null) { 344bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mFilter = getArguments().getInt(ARG_FILTER, FILTER_ALLOW_ALL); 345bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 346bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return mFilter; 347bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 348bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 349bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 350bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onAttach(Activity activity) { 351bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Need to setup the account first thing 352bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mAccount = getArguments().getParcelable(ARG_ACCOUNT); 353bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super.onAttach(activity); 354bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 355bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 356bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 357bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onActivityCreated(Bundle savedInstanceState) { 358bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super.onActivityCreated(savedInstanceState); 359bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook getActivity().setTitle(R.string.mailbox_shortcut_picker_title); 360bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (!mLoadFinished) { 361bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook getActivity().setVisible(false); 362bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 363bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 364bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 365bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 366bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 367bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Cursor cursor = (Cursor) parent.getItemAtPosition(position); 368bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook long mailboxId = cursor.getLong(cursor.getColumnIndex(REAL_ID)); 369bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mCallback.onSelected(mAccount, mailboxId); 370bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 371bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 372bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 373bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public Loader<Cursor> onCreateLoader(int id, Bundle args) { 374bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook Context context = getActivity(); 375bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // TODO Create a fully-qualified path name for Exchange accounts [code should also work 376bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // for MoveMessageToDialog.java] 377bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook HostAuth recvAuth = mAccount.getOrCreateHostAuthRecv(context); 378bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook final String[] projection; 379bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook final String orderBy; 380bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook final String selection; 381bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (recvAuth.isEasConnection()) { 382bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook projection = EAS_PROJECTION; 383bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook orderBy = MailboxColumns.DISPLAY_NAME; 384bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } else { 385bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook projection = IMAP_PROJECTION; 386bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook orderBy = MailboxColumns.SERVER_ID; 387bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 388bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if ((getFilter() & FILTER_INBOX_ONLY) == 0) { 389bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook selection = ALL_MAILBOX_SELECTION; 390bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } else { 391bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook selection = INBOX_ONLY_SELECTION; 392bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 393bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return new MailboxPickerLoader( 394bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook context, Mailbox.CONTENT_URI, projection, selection, 395bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook new String[] { Long.toString(mAccount.mId) }, orderBy, mAccount.mId, 396bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook (getFilter() & FILTER_ALLOW_UNREAD) != 0); 397bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 398bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 399bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 400bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 401bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // No accounts; close the dialog 402bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (data.getCount() == 0) { 403bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mCallback.onMissingData(false, true); 404bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return; 405bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 406bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // if there is only one mailbox, auto-select it 407bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook if (data.getCount() == 1 && data.moveToFirst()) { 408bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook long mailboxId = data.getLong(data.getColumnIndex(REAL_ID)); 409bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mCallback.onSelected(mAccount, mailboxId); 410bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return; 411bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 412bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook super.onLoadFinished(loader, data); 413bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook mLoadFinished = true; 414bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook getActivity().setVisible(true); 415bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 416bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 417bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook @Override 418bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook String[] getFromColumns() { 419bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook return MAILBOX_FROM_COLUMNS; 420bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 421bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook } 422bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook} 423