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