15675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy/*
25675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy * Copyright (C) 2011 The Android Open Source Project
35675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy *
45675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy * Licensed under the Apache License, Version 2.0 (the "License");
55675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy * you may not use this file except in compliance with the License.
65675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy * You may obtain a copy of the License at
75675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy *
85675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy *      http://www.apache.org/licenses/LICENSE-2.0
95675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy *
105675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy * Unless required by applicable law or agreed to in writing, software
115675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy * distributed under the License is distributed on an "AS IS" BASIS,
125675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy * See the License for the specific language governing permissions and
145675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy * limitations under the License.
155675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy */
165675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
175675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedypackage com.android.email.activity;
185675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
19d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErikimport com.android.email.R;
20d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErikimport com.android.emailcommon.provider.Account;
21d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErikimport com.android.emailcommon.provider.EmailContent.AccountColumns;
22d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErikimport com.android.emailcommon.provider.EmailContent.MailboxColumns;
23d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErikimport com.android.emailcommon.provider.HostAuth;
24d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErikimport com.android.emailcommon.provider.Mailbox;
25d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik
265675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedyimport android.app.Activity;
27b4f6404cd1a8e96d177995cad797e9f440fc979eTodd Kennedyimport android.app.FragmentTransaction;
285675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedyimport android.app.ListFragment;
295675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedyimport android.app.LoaderManager.LoaderCallbacks;
300f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedyimport android.content.ContentValues;
315675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedyimport android.content.Context;
325675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedyimport android.content.CursorLoader;
335675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedyimport android.content.Loader;
34b19516e24836c9479c6ecfbf3d54d58cf64782edTodd Kennedyimport android.content.res.Resources;
355675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedyimport android.database.Cursor;
360f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedyimport android.database.MatrixCursor;
370f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedyimport android.database.MatrixCursor.RowBuilder;
38e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komaloimport android.database.MergeCursor;
390f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedyimport android.net.Uri;
405675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedyimport android.os.Bundle;
415675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedyimport android.view.View;
425675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedyimport android.widget.AdapterView;
43e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komaloimport android.widget.AdapterView.OnItemClickListener;
445675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedyimport android.widget.ListView;
455675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedyimport android.widget.SimpleCursorAdapter;
46e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo
475675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy/**
485675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy * Fragment containing a list of accounts to show during shortcut creation.
49ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy * <p>
50ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy * NOTE: In order to receive callbacks, the activity containing this fragment must implement
51ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy * the {@link PickerCallback} interface.
525675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy */
535675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedypublic abstract class ShortcutPickerFragment extends ListFragment
545675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        implements OnItemClickListener, LoaderCallbacks<Cursor> {
55ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy    /** Callback methods. Enclosing activities must implement to receive fragment notifications. */
56ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy    public static interface PickerCallback {
57e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        /** Builds a mailbox filter for the given account. See MailboxShortcutPickerFragment. */
58e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        public Integer buildFilter(Account account);
59ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy        /** Invoked when an account and mailbox have been selected. */
60ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy        public void onSelected(Account account, long mailboxId);
61ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy        /** Required data is missing; either the account and/or mailbox */
62ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy        public void onMissingData(boolean missingAccount, boolean missingMailbox);
63ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy    }
64ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy
65ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy    /** A no-op callback */
66ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy    private final PickerCallback EMPTY_CALLBACK = new PickerCallback() {
67e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        @Override public Integer buildFilter(Account account) { return null; }
68ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy        @Override public void onSelected(Account account, long mailboxId){ getActivity().finish(); }
69ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy        @Override public void onMissingData(boolean missingAccount, boolean missingMailbox) { }
70ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy    };
715675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    private final static int LOADER_ID = 0;
725675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    private final static int[] TO_VIEWS = new int[] {
735675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        android.R.id.text1,
745675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    };
755675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
76ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy    PickerCallback mCallback = EMPTY_CALLBACK;
775675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    /** Cursor adapter that provides either the account or mailbox list */
785675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    private SimpleCursorAdapter mAdapter;
795675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
805675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    @Override
815675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    public void onAttach(Activity activity) {
825675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        super.onAttach(activity);
835675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
84ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy        if (activity instanceof PickerCallback) {
85ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy            mCallback = (PickerCallback) activity;
86ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy        }
875675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        final String[] fromColumns = getFromColumns();
885675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        mAdapter = new SimpleCursorAdapter(activity,
895675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            android.R.layout.simple_expandable_list_item_1, null, fromColumns, TO_VIEWS, 0);
905675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        setListAdapter(mAdapter);
915675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
925675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        getLoaderManager().initLoader(LOADER_ID, null, this);
935675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    }
945675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
955675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    @Override
965675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    public void onActivityCreated(Bundle savedInstanceState) {
975675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        super.onActivityCreated(savedInstanceState);
985675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
995675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        ListView listView = getListView();
1005675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        listView.setOnItemClickListener(this);
1015675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        listView.setItemsCanFocus(false);
1025675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    }
1035675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
1045675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    @Override
1055675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
1065675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        mAdapter.swapCursor(data);
1075675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    }
1085675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
1095675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    @Override
1105675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    public void onLoaderReset(Loader<Cursor> loader) {
1115675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        mAdapter.swapCursor(null);
1125675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    }
1135675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
1145675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    /** Returns the cursor columns to map into list */
1155675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    abstract String[] getFromColumns();
1165675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
1170f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy    // TODO if we add meta-accounts to the database, remove this class entirely
1180f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy    private static final class AccountPickerLoader extends CursorLoader {
1190f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        public AccountPickerLoader(Context context, Uri uri, String[] projection, String selection,
1200f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                String[] selectionArgs, String sortOrder) {
1210f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            super(context, uri, projection, selection, selectionArgs, sortOrder);
1220f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        }
1230f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy
1240f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        @Override
1250f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        public Cursor loadInBackground() {
1260f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            Cursor parentCursor = super.loadInBackground();
127b19516e24836c9479c6ecfbf3d54d58cf64782edTodd Kennedy            int cursorCount = parentCursor.getCount();
128b19516e24836c9479c6ecfbf3d54d58cf64782edTodd Kennedy            final Cursor returnCursor;
1290f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy
130b19516e24836c9479c6ecfbf3d54d58cf64782edTodd Kennedy            if (cursorCount > 1) {
1310f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                // Only add "All accounts" if there is more than 1 account defined
1320f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                MatrixCursor allAccountCursor = new MatrixCursor(getProjection());
133b19516e24836c9479c6ecfbf3d54d58cf64782edTodd Kennedy                addCombinedAccountRow(allAccountCursor, cursorCount);
1340f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                returnCursor = new MergeCursor(new Cursor[] { allAccountCursor, parentCursor });
1350f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            } else {
1360f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                returnCursor = parentCursor;
1370f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            }
1380f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            return returnCursor;
1390f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        }
1400f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy
1410f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        /** Adds a row for "All Accounts" into the given cursor */
142b19516e24836c9479c6ecfbf3d54d58cf64782edTodd Kennedy        private void addCombinedAccountRow(MatrixCursor cursor, int accountCount) {
1430f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            Context context = getContext();
1440f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            Account account = new Account();
1450f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            account.mId = Account.ACCOUNT_ID_COMBINED_VIEW;
146b19516e24836c9479c6ecfbf3d54d58cf64782edTodd Kennedy            Resources res = context.getResources();
147b19516e24836c9479c6ecfbf3d54d58cf64782edTodd Kennedy            String countString = res.getQuantityString(R.plurals.picker_combined_view_account_count,
148b19516e24836c9479c6ecfbf3d54d58cf64782edTodd Kennedy                    accountCount, accountCount);
149b19516e24836c9479c6ecfbf3d54d58cf64782edTodd Kennedy            account.mDisplayName = res.getString(R.string.picker_combined_view_fmt, countString);
1500f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            ContentValues values = account.toContentValues();
1510f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            RowBuilder row = cursor.newRow();
1520f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            for (String rowName : cursor.getColumnNames()) {
1530f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                // special case some of the rows ...
1540f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                if (AccountColumns.ID.equals(rowName)) {
1550f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                    row.add(Account.ACCOUNT_ID_COMBINED_VIEW);
1560f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                    continue;
1570f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                } else if (AccountColumns.IS_DEFAULT.equals(rowName)) {
1580f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                    row.add(0);
1590f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                    continue;
1600f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                }
1610f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                row.add(values.get(rowName));
1620f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            }
1630f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        }
1640f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy    }
1650f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy
1665675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    /** Account picker */
1675675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    public static class AccountShortcutPickerFragment extends ShortcutPickerFragment {
168d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik        private volatile Boolean mLoadFinished = new Boolean(false);
1695675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        private final static String[] ACCOUNT_FROM_COLUMNS = new String[] {
1705675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            AccountColumns.DISPLAY_NAME,
1715675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        };
1725675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
1735675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        @Override
1745675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        public void onActivityCreated(Bundle savedInstanceState) {
1755675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            super.onActivityCreated(savedInstanceState);
1765675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            getActivity().setTitle(R.string.account_shortcut_picker_title);
177d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik            if (!mLoadFinished) {
178d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik                getActivity().setVisible(false);
179d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik            }
1805675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        }
1815675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
1825675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        @Override
1835675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
1845675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            Cursor cursor = (Cursor) parent.getItemAtPosition(position);
185b4f6404cd1a8e96d177995cad797e9f440fc979eTodd Kennedy            selectAccountCursor(cursor, true);
1865675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        }
1875675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
1885675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        @Override
1895675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
1905675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            Context context = getActivity();
1910f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            return new AccountPickerLoader(
1925675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy                context, Account.CONTENT_URI, Account.CONTENT_PROJECTION, null, null, null);
1935675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        }
1945675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
1955675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        @Override
196e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
197e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy            // if there is only one account, auto-select it
198ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy            // No accounts; close the dialog
199ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy            if (data.getCount() == 0) {
200ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy                mCallback.onMissingData(true, false);
201ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy                return;
202ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy            }
203e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy            if (data.getCount() == 1 && data.moveToFirst()) {
204b4f6404cd1a8e96d177995cad797e9f440fc979eTodd Kennedy                selectAccountCursor(data, false);
205e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy                return;
206e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy            }
207e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy            super.onLoadFinished(loader, data);
208d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik            mLoadFinished = true;
209d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik            getActivity().setVisible(true);
210e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy        }
211e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy
212e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy        @Override
2135675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        String[] getFromColumns() {
2145675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            return ACCOUNT_FROM_COLUMNS;
2155675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        }
216e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy
217e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy        /** Selects the account specified by the given cursor */
218b4f6404cd1a8e96d177995cad797e9f440fc979eTodd Kennedy        private void selectAccountCursor(Cursor cursor, boolean allowBack) {
219e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy            Account account = new Account();
220e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy            account.restore(cursor);
221e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo            ShortcutPickerFragment fragment = MailboxShortcutPickerFragment.newInstance(
222e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo                    getActivity(), account, mCallback.buildFilter(account));
223b4f6404cd1a8e96d177995cad797e9f440fc979eTodd Kennedy            FragmentTransaction transaction = getFragmentManager().beginTransaction();
224b4f6404cd1a8e96d177995cad797e9f440fc979eTodd Kennedy            transaction.replace(R.id.shortcut_list, fragment);
225b4f6404cd1a8e96d177995cad797e9f440fc979eTodd Kennedy            if (allowBack) {
226b4f6404cd1a8e96d177995cad797e9f440fc979eTodd Kennedy                transaction.addToBackStack(null);
227b4f6404cd1a8e96d177995cad797e9f440fc979eTodd Kennedy            }
228b4f6404cd1a8e96d177995cad797e9f440fc979eTodd Kennedy            transaction.commitAllowingStateLoss();
229e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy        }
2305675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    }
2315675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
2320f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy    // TODO if we add meta-mailboxes to the database, remove this class entirely
2330f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy    private static final class MailboxPickerLoader extends CursorLoader {
2340f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        private final long mAccountId;
2352f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy        private final boolean mAllowUnread;
2360f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        public MailboxPickerLoader(Context context, Uri uri, String[] projection, String selection,
2372f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                String[] selectionArgs, String sortOrder, long accountId, boolean allowUnread) {
2380f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            super(context, uri, projection, selection, selectionArgs, sortOrder);
2390f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            mAccountId = accountId;
2402f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            mAllowUnread = allowUnread;
2410f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        }
2420f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy
2430f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        @Override
2440f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        public Cursor loadInBackground() {
2452f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            MatrixCursor unreadCursor =
2462f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                    new MatrixCursor(MailboxShortcutPickerFragment.MATRIX_PROJECTION);
2472f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            Context context = getContext();
2482f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            if (mAllowUnread) {
2492f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                // For the special mailboxes, their ID is < 0. The UI list does not deal with
2502f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                // negative values very well, so, add MAX_VALUE to ensure they're positive, but,
2512f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                // don't clash with legitimate mailboxes.
2522f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                String mailboxName = context.getString(R.string.picker_mailbox_name_all_unread);
2532f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                unreadCursor.addRow(
2542f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                        new Object[] {
2552f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                            Integer.MAX_VALUE + Mailbox.QUERY_ALL_UNREAD,
2562f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                            Mailbox.QUERY_ALL_UNREAD,
2572f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                            mailboxName,
2582f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                        });
2592f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            }
2602f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy
2610f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            if (mAccountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
2620f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                // Do something special for the "combined" view
2632f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                MatrixCursor combinedMailboxesCursor =
2642f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                        new MatrixCursor(MailboxShortcutPickerFragment.MATRIX_PROJECTION);
2650f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                // For the special mailboxes, their ID is < 0. The UI list does not deal with
2660f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                // negative values very well, so, add MAX_VALUE to ensure they're positive, but,
2670f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                // don't clash with legitimate mailboxes.
2682f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                String mailboxName = context.getString(R.string.picker_mailbox_name_all_inbox);
2690f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy                combinedMailboxesCursor.addRow(
2702f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                        new Object[] {
2712f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                            Integer.MAX_VALUE + Mailbox.QUERY_ALL_INBOXES,
2722f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                            Mailbox.QUERY_ALL_INBOXES,
2732f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                            mailboxName
2742f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                        });
2752f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                return new MergeCursor(new Cursor[] { combinedMailboxesCursor, unreadCursor });
2760f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            }
2770f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy
2780f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            // Loading for a regular account; perform a normal load
2792f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            return new MergeCursor(new Cursor[] { super.loadInBackground(), unreadCursor });
2800f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy        }
2810f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy    }
2820f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy
2835675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    /** Mailbox picker */
2845675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    public static class MailboxShortcutPickerFragment extends ShortcutPickerFragment {
285e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        /** Allow all mailboxes in the mailbox list */
286e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        public static int FILTER_ALLOW_ALL    = 0;
287e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        /** Only allow an account's INBOX */
288e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        public static int FILTER_INBOX_ONLY   = 1 << 0;
289e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        /** Allow an "unread" mailbox; this is not affected by {@link #FILTER_INBOX_ONLY} */
290e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        public static int FILTER_ALLOW_UNREAD = 1 << 1;
291e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        /** Fragment argument to set filter values */
292e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        static final String ARG_FILTER  = "MailboxShortcutPickerFragment.filter";
2935675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        static final String ARG_ACCOUNT = "MailboxShortcutPickerFragment.account";
294e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo
2952f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy        private final static String REAL_ID = "realId";
2965675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        private final static String[] MAILBOX_FROM_COLUMNS = new String[] {
2975675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            MailboxColumns.DISPLAY_NAME,
2985675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        };
2995675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        /** Loader projection used for IMAP & POP3 accounts */
3005675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        private final static String[] IMAP_PROJECTION = new String [] {
3012f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            MailboxColumns.ID, MailboxColumns.ID + " as " + REAL_ID,
3022f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            MailboxColumns.SERVER_ID + " as " + MailboxColumns.DISPLAY_NAME
3035675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        };
3045675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        /** Loader projection used for EAS accounts */
3055675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        private final static String[] EAS_PROJECTION = new String [] {
3062f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            MailboxColumns.ID, MailboxColumns.ID + " as " + REAL_ID,
3072f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            MailboxColumns.DISPLAY_NAME
3085675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        };
3092f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy        /** Loader projection used for a matrix cursor */
3102f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy        private final static String[] MATRIX_PROJECTION = new String [] {
3112f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            MailboxColumns.ID, REAL_ID, MailboxColumns.DISPLAY_NAME
3122f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy        };
3132f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy        // TODO #ALL_MAILBOX_SELECTION is identical to MailboxesAdapter#ALL_MAILBOX_SELECTION;
3142f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy        // create a common selection. Move this to the Mailbox class?
3152f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy        /** Selection for all visible mailboxes for an account */
3165675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        private final static String ALL_MAILBOX_SELECTION = MailboxColumns.ACCOUNT_KEY + "=?" +
3175675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy                " AND " + Mailbox.USER_VISIBLE_MAILBOX_SELECTION;
3182f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy        /** Selection for just the INBOX of an account */
3192f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy        private final static String INBOX_ONLY_SELECTION = ALL_MAILBOX_SELECTION +
3202f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                    " AND " + MailboxColumns.TYPE + " = " + Mailbox.TYPE_INBOX;
321d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik        private volatile Boolean mLoadFinished = new Boolean(false);
3225675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        /** The currently selected account */
3235675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        private Account mAccount;
324e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        /** The filter values; default to allow all mailboxes */
325e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        private Integer mFilter;
326e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo
327e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        /**
328e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo         * Builds a mailbox shortcut picker for the given account.
329e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo         */
330e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        public static MailboxShortcutPickerFragment newInstance(
331e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo                Context context, Account account, Integer filter) {
332e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo
333e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo            MailboxShortcutPickerFragment fragment = new MailboxShortcutPickerFragment();
334e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo            Bundle args = new Bundle();
335e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo            args.putParcelable(ARG_ACCOUNT, account);
336e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo            args.putInt(ARG_FILTER, filter);
337e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo            fragment.setArguments(args);
338e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo            return fragment;
339e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        }
340e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo
341e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        /** Returns the mailbox filter */
342e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        int getFilter() {
343e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo            if (mFilter == null) {
344e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo                mFilter = getArguments().getInt(ARG_FILTER, FILTER_ALLOW_ALL);
345e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo            }
346e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo            return mFilter;
347e10215eaff7c06b44b95de87ea46030065ecbee5Ben Komalo        }
3485675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
3495675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        @Override
3505675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        public void onAttach(Activity activity) {
3515675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            // Need to setup the account first thing
3525675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            mAccount = getArguments().getParcelable(ARG_ACCOUNT);
3535675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            super.onAttach(activity);
3545675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        }
3555675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
3565675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        @Override
3575675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        public void onActivityCreated(Bundle savedInstanceState) {
3585675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            super.onActivityCreated(savedInstanceState);
3595675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            getActivity().setTitle(R.string.mailbox_shortcut_picker_title);
360d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik            if (!mLoadFinished) {
361d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik                getActivity().setVisible(false);
362d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik            }
3635675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        }
3645675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
3655675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        @Override
3665675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
3675675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            Cursor cursor = (Cursor) parent.getItemAtPosition(position);
3682f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            long mailboxId = cursor.getLong(cursor.getColumnIndex(REAL_ID));
369ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy            mCallback.onSelected(mAccount, mailboxId);
3705675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        }
3715675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
3725675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        @Override
3735675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
3745675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            Context context = getActivity();
3755675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            // TODO Create a fully-qualified path name for Exchange accounts [code should also work
3765675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            //      for MoveMessageToDialog.java]
3775675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            HostAuth recvAuth = mAccount.getOrCreateHostAuthRecv(context);
3785675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            final String[] projection;
3795675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            final String orderBy;
3802f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            final String selection;
3815675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            if (recvAuth.isEasConnection()) {
3825675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy                projection = EAS_PROJECTION;
3835675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy                orderBy = MailboxColumns.DISPLAY_NAME;
3845675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            } else {
3855675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy                projection = IMAP_PROJECTION;
3865675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy                orderBy = MailboxColumns.SERVER_ID;
3875675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            }
3882f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            if ((getFilter() & FILTER_INBOX_ONLY) == 0) {
3892f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                selection = ALL_MAILBOX_SELECTION;
3902f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            } else {
3912f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                selection = INBOX_ONLY_SELECTION;
3922f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy            }
3930f84ff2c082dc4ea774f53fe6877752a769ca258Todd Kennedy            return new MailboxPickerLoader(
3942f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                context, Mailbox.CONTENT_URI, projection, selection,
3952f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                new String[] { Long.toString(mAccount.mId) }, orderBy, mAccount.mId,
3962f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                (getFilter() & FILTER_ALLOW_UNREAD) != 0);
3975675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        }
3985675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy
3995675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        @Override
400e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
401ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy            // No accounts; close the dialog
402ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy            if (data.getCount() == 0) {
403ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy                mCallback.onMissingData(false, true);
404ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy                return;
405ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy            }
406e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy            // if there is only one mailbox, auto-select it
407e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy            if (data.getCount() == 1 && data.moveToFirst()) {
4082f5ee8e2d1e106340eb2a21b1ada6db1987bd98fTodd Kennedy                long mailboxId = data.getLong(data.getColumnIndex(REAL_ID));
409ae8e612ed5eb00c228070f4f43359cc7eae99932Todd Kennedy                mCallback.onSelected(mAccount, mailboxId);
410e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy                return;
411e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy            }
412e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy            super.onLoadFinished(loader, data);
413d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik            mLoadFinished = true;
414d39cf1938a468bb1ba77538140bc2ef80d634e36RoboErik            getActivity().setVisible(true);
415e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy        }
416e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy
417e2d227ffeda71ef08a11c08c5b1a2345a03091c8Todd Kennedy        @Override
4185675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        String[] getFromColumns() {
4195675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy            return MAILBOX_FROM_COLUMNS;
4205675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy        }
4215675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy    }
4225675ea88d3cc4ba9934d2a54fee008fd324d711fTodd Kennedy}
423