SingleFolderSelectionDialog.java revision 74098779f90c61487ff0b5bbb7a458f0a8818047
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); 832a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler 842a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler mAdapter.clearSections(); 852a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler // TODO(mindyp) : bring this back in UR8 when Email providers 862a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler // will have divided folder sections. 872a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler final String[] headers = context.getResources().getStringArray( 882a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler R.array.moveto_folder_sections); 892a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler // Currently, the number of adapters are assumed to match the 902a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler // number of headers in the string array. 912a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler mAdapter.addSection(new SystemFolderSelectorAdapter(context, data, 922a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler R.layout.single_folders_view, headers[0], mCurrentFolder)); 932a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler 942a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler // TODO(mindyp): we currently do not support frequently moved to 952a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler // folders, at headers[1]; need to define what that means.*/ 962a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler // TODO(pwestbro): determine if we need to call filterFolders 9774098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao // if filterFolders is not necessary, remove the method decl with one arg. 982a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler mAdapter.addSection( 992a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler new UserFolderHierarchicalFolderSelectorAdapter(context, 10074098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao AddableFolderSelectorAdapter.filterFolders(data), 1012a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler R.layout.single_folders_view, headers[2], mCurrentFolder)); 1022a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler 1032a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler dialog.getListView().setAdapter(mAdapter); 1042a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler } 1052a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler 1062a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler @Override 1072a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler public void onLoaderReset(Loader<Cursor> loader) { 1082a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler mAdapter.clearSections(); 1092a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler } 1102a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler }); 111a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp } 112a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp 1139eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei @Override 1148f98ac013f775cdf186578018f926ac329070541Mark Wei protected void onListItemClick(int position) { 1158f98ac013f775cdf186578018f926ac329070541Mark Wei final Object item = mAdapter.getItem(position); 1168f98ac013f775cdf186578018f926ac329070541Mark Wei if (item instanceof FolderRow) { 1178f98ac013f775cdf186578018f926ac329070541Mark Wei final Folder folder = ((FolderRow) item).getFolder(); 1188f98ac013f775cdf186578018f926ac329070541Mark Wei ArrayList<FolderOperation> ops = new ArrayList<FolderOperation>(); 1198f98ac013f775cdf186578018f926ac329070541Mark Wei // Remove the current folder and add the new folder. 1208f98ac013f775cdf186578018f926ac329070541Mark Wei ops.add(new FolderOperation(mCurrentFolder, false)); 1218f98ac013f775cdf186578018f926ac329070541Mark Wei ops.add(new FolderOperation(folder, true)); 1222a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler getConversationUpdater() 1232a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler .assignFolder(ops, mTarget, mBatch, true /* showUndo */, true /* isMoveTo */); 1242a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler dismiss(); 1258f98ac013f775cdf186578018f926ac329070541Mark Wei } 126a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp } 127a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp 128a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp @Override 129a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp public void onClick(DialogInterface dialog, int which) { 130a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp // Do nothing. 131a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp } 132a7e154530add87e05d1fcee980e1a1fc34a456e7mindyp} 133