1a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp/*
2a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp * Copyright (C) 2012 Google Inc.
3a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp * Licensed to The Android Open Source Project.
4a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp *
5a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp * Licensed under the Apache License, Version 2.0 (the "License");
6a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp * you may not use this file except in compliance with the License.
7a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp * You may obtain a copy of the License at
8a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp *
9a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp *      http://www.apache.org/licenses/LICENSE-2.0
10a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp *
11a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp * Unless required by applicable law or agreed to in writing, software
12a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp * distributed under the License is distributed on an "AS IS" BASIS,
13a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp * See the License for the specific language governing permissions and
15a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp * limitations under the License.
16a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp */
17a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp
18a7e154530add87e05d1fcee980e1a1fc34a456e7mindyppackage com.android.mail.ui;
19a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp
202a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantlerimport android.app.AlertDialog;
212a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantlerimport android.app.LoaderManager;
22a7e154530add87e05d1fcee980e1a1fc34a456e7mindypimport android.content.Context;
232a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantlerimport android.content.CursorLoader;
24a7e154530add87e05d1fcee980e1a1fc34a456e7mindypimport android.content.DialogInterface;
252a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantlerimport android.content.Loader;
26a7e154530add87e05d1fcee980e1a1fc34a456e7mindypimport android.database.Cursor;
272a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantlerimport android.net.Uri;
282a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantlerimport android.os.Bundle;
29a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp
30a7e154530add87e05d1fcee980e1a1fc34a456e7mindypimport com.android.mail.R;
31a7e154530add87e05d1fcee980e1a1fc34a456e7mindypimport com.android.mail.providers.Folder;
32a7e154530add87e05d1fcee980e1a1fc34a456e7mindypimport com.android.mail.providers.UIProvider;
33a7e154530add87e05d1fcee980e1a1fc34a456e7mindypimport com.android.mail.ui.FolderSelectorAdapter.FolderRow;
34a7e154530add87e05d1fcee980e1a1fc34a456e7mindypimport com.android.mail.utils.Utils;
35a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp
36a7e154530add87e05d1fcee980e1a1fc34a456e7mindypimport java.util.ArrayList;
37a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp
38a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp/**
39a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp * Displays a folder selection dialog for the conversation provided. It allows
40a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp * the user to switch a conversation from one folder to another.
41a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp */
428f98ac013f775cdf186578018f926ac329070541Mark Weipublic class SingleFolderSelectionDialog extends FolderSelectionDialog {
432a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler    public SingleFolderSelectionDialog() {}
449eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei
452a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler    private static final int FOLDER_LOADER_ID = 0;
462a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler    private static final String FOLDER_QUERY_URI_TAG = "folderQueryUri";
47a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp
488f98ac013f775cdf186578018f926ac329070541Mark Wei    @Override
492a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler    public void onCreate(Bundle savedInstanceState) {
502a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler        super.onCreate(savedInstanceState);
512a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler
522a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler        mTitleId = R.string.move_to_selection_dialog_title;
532a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler
542a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler        final Bundle args = new Bundle(1);
552a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler        args.putParcelable(FOLDER_QUERY_URI_TAG, !Utils.isEmpty(mAccount.fullFolderListUri) ?
562a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                mAccount.fullFolderListUri : mAccount.folderListUri);
572a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler        final Context loaderContext = getActivity().getApplicationContext();
582a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler        getLoaderManager().initLoader(FOLDER_LOADER_ID, args,
592a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                new LoaderManager.LoaderCallbacks<Cursor>() {
602a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                    @Override
612a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
622a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        final Uri queryUri = args.getParcelable(FOLDER_QUERY_URI_TAG);
632a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        return new CursorLoader(loaderContext, queryUri,
642a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                                UIProvider.FOLDERS_PROJECTION, null, null, null);
652a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                    }
662a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler
672a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                    @Override
682a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
692a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        final Context context = getActivity();
702a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        if (data == null || context == null) {
712a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                            return;
722a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        }
732a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler
742a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        final AlertDialog dialog = (AlertDialog) getDialog();
755291de861af3e7cf11719a71f0a236d76a79b327Martin Hibdon                        if (dialog == null) {
765291de861af3e7cf11719a71f0a236d76a79b327Martin Hibdon                            // This could happen if the dialog is dismissed just before the
775291de861af3e7cf11719a71f0a236d76a79b327Martin Hibdon                            // load finishes.
785291de861af3e7cf11719a71f0a236d76a79b327Martin Hibdon                            return;
795291de861af3e7cf11719a71f0a236d76a79b327Martin Hibdon                        }
802a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        // The number of view types changes here, so we have to reset the ListView's
812a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        // adapter.
822a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        dialog.getListView().setAdapter(null);
83cc2e1ee5ea19d1b166a7542ea03f4fd4e5c807e3Rohan Shah                        dialog.getListView().setDivider(null);
842a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler
852a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        mAdapter.clearSections();
862a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler
87eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                        // Create a system folder adapter and an adapter for hierarchical
88eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                        // and user folders. If there are no folders added to either of them,
89eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                        // do not add as a section since a 0-count adapter will result in an
90eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                        // IndexOutOfBoundsException.
91eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                        SystemFolderSelectorAdapter sysFolderAdapter =
92eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                                new SystemFolderSelectorAdapter(context, data,
93eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                                    R.layout.single_folders_view, mCurrentFolder);
94eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                        if (sysFolderAdapter.getCount() > 0) {
95eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                            mAdapter.addSection(sysFolderAdapter);
96eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                        }
97eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah
982a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        // TODO(pwestbro): determine if we need to call filterFolders
9974098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                        // if filterFolders is not necessary, remove the method decl with one arg.
100eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                        UserFolderHierarchicalFolderSelectorAdapter hierarchicalAdapter =
1012a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                                new UserFolderHierarchicalFolderSelectorAdapter(context,
102eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                                    AddableFolderSelectorAdapter.filterFolders(data),
103eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                                    R.layout.single_folders_view, mCurrentFolder);
104eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                        if (hierarchicalAdapter.getCount() > 0) {
105eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                            mAdapter.addSection(hierarchicalAdapter);
106eec2e988e634e5cd501b4fce3e78d6caadfe7558Rohan Shah                        }
1072a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler
1082a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        dialog.getListView().setAdapter(mAdapter);
1092a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                    }
1102a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler
1112a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                    @Override
1122a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                    public void onLoaderReset(Loader<Cursor> loader) {
1132a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                        mAdapter.clearSections();
1142a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                    }
1152a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                });
116a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp    }
117a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp
1189eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei    @Override
1198f98ac013f775cdf186578018f926ac329070541Mark Wei    protected void onListItemClick(int position) {
1208f98ac013f775cdf186578018f926ac329070541Mark Wei        final Object item = mAdapter.getItem(position);
1218f98ac013f775cdf186578018f926ac329070541Mark Wei        if (item instanceof FolderRow) {
1228f98ac013f775cdf186578018f926ac329070541Mark Wei            final Folder folder = ((FolderRow) item).getFolder();
1238f98ac013f775cdf186578018f926ac329070541Mark Wei            ArrayList<FolderOperation> ops = new ArrayList<FolderOperation>();
1248f98ac013f775cdf186578018f926ac329070541Mark Wei            // Remove the current folder and add the new folder.
1258f98ac013f775cdf186578018f926ac329070541Mark Wei            ops.add(new FolderOperation(mCurrentFolder, false));
1268f98ac013f775cdf186578018f926ac329070541Mark Wei            ops.add(new FolderOperation(folder, true));
1272a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler            getConversationUpdater()
1282a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler                    .assignFolder(ops, mTarget, mBatch, true /* showUndo */, true /* isMoveTo */);
1292a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler            dismiss();
1308f98ac013f775cdf186578018f926ac329070541Mark Wei        }
131a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp    }
132a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp
133a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp    @Override
134a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp    public void onClick(DialogInterface dialog, int which) {
135a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp        // Do nothing.
136a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp    }
137a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp}
138