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