FolderSelectionDialog.java revision 0cb4aaaadb50664422a2595361d26878ffe5dc04
19eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei/* 29eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * Copyright (C) 2012 Google Inc. 39eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * Licensed to The Android Open Source Project. 49eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * 59eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * Licensed under the Apache License, Version 2.0 (the "License"); 69eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * you may not use this file except in compliance with the License. 79eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * You may obtain a copy of the License at 89eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * 99eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * http://www.apache.org/licenses/LICENSE-2.0 109eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * 119eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * Unless required by applicable law or agreed to in writing, software 129eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * distributed under the License is distributed on an "AS IS" BASIS, 139eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * See the License for the specific language governing permissions and 159eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei * limitations under the License. 169eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei */ 179eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei 189eb1c9a76a400f84c002b58c831119119ebf4870Mark Weipackage com.android.mail.ui; 199eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei 208f98ac013f775cdf186578018f926ac329070541Mark Weiimport android.app.AlertDialog; 218f98ac013f775cdf186578018f926ac329070541Mark Weiimport android.content.Context; 229eb1c9a76a400f84c002b58c831119119ebf4870Mark Weiimport android.content.DialogInterface; 238f98ac013f775cdf186578018f926ac329070541Mark Weiimport android.content.DialogInterface.OnClickListener; 249eb1c9a76a400f84c002b58c831119119ebf4870Mark Weiimport android.content.DialogInterface.OnDismissListener; 258f98ac013f775cdf186578018f926ac329070541Mark Weiimport android.os.AsyncTask; 268f98ac013f775cdf186578018f926ac329070541Mark Weiimport android.view.View; 278f98ac013f775cdf186578018f926ac329070541Mark Weiimport android.widget.AdapterView; 289eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei 298f98ac013f775cdf186578018f926ac329070541Mark Weiimport com.android.mail.R; 308f98ac013f775cdf186578018f926ac329070541Mark Weiimport com.android.mail.providers.Account; 318f98ac013f775cdf186578018f926ac329070541Mark Weiimport com.android.mail.providers.Conversation; 328f98ac013f775cdf186578018f926ac329070541Mark Weiimport com.android.mail.providers.Folder; 338f98ac013f775cdf186578018f926ac329070541Mark Weiimport com.android.mail.providers.UIProvider; 348f98ac013f775cdf186578018f926ac329070541Mark Weiimport com.android.mail.utils.LogTag; 359eb1c9a76a400f84c002b58c831119119ebf4870Mark Weiimport com.android.mail.utils.LogUtils; 369eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei 378f98ac013f775cdf186578018f926ac329070541Mark Weiimport java.util.Collection; 388f98ac013f775cdf186578018f926ac329070541Mark Wei 398f98ac013f775cdf186578018f926ac329070541Mark Weipublic abstract class FolderSelectionDialog implements OnClickListener, OnDismissListener { 408f98ac013f775cdf186578018f926ac329070541Mark Wei protected static final String LOG_TAG = LogTag.getLogTag(); 419eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei private static boolean sDialogShown; 429eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei 438f98ac013f775cdf186578018f926ac329070541Mark Wei protected AlertDialog mDialog; 44e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy protected final ConversationUpdater mUpdater; 45e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy protected final SeparatedFolderListAdapter mAdapter; 46e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy protected final Collection<Conversation> mTarget; 47e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy protected final boolean mBatch; 48e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy protected final QueryRunner mRunner; 49e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy protected final Account mAccount; 50e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy protected final AlertDialog.Builder mBuilder; 51e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy protected final Folder mCurrentFolder; 528f98ac013f775cdf186578018f926ac329070541Mark Wei 53e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy public static FolderSelectionDialog getInstance(final Context context, final Account account, 54e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy final ConversationUpdater updater, final Collection<Conversation> target, 55e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy final boolean isBatch, final Folder currentFolder, final boolean isMoveTo) { 568f98ac013f775cdf186578018f926ac329070541Mark Wei if (sDialogShown) { 578f98ac013f775cdf186578018f926ac329070541Mark Wei return null; 588f98ac013f775cdf186578018f926ac329070541Mark Wei } 598f98ac013f775cdf186578018f926ac329070541Mark Wei 600cb4aaaadb50664422a2595361d26878ffe5dc04Scott Kennedy /* 610cb4aaaadb50664422a2595361d26878ffe5dc04Scott Kennedy * TODO: This method should only be called with isMoveTo=true if this capability is not 620cb4aaaadb50664422a2595361d26878ffe5dc04Scott Kennedy * present on the account, so we should be able to remove the check here. 630cb4aaaadb50664422a2595361d26878ffe5dc04Scott Kennedy */ 6400bbdef40b1d1e5fda3ac9157550f2da74b37163Rohan Shah if (isMoveTo || !account.supportsCapability( 6500bbdef40b1d1e5fda3ac9157550f2da74b37163Rohan Shah UIProvider.AccountCapabilities.MULTIPLE_FOLDERS_PER_CONV)) { 6600bbdef40b1d1e5fda3ac9157550f2da74b37163Rohan Shah return new SingleFolderSelectionDialog( 678f98ac013f775cdf186578018f926ac329070541Mark Wei context, account, updater, target, isBatch, currentFolder); 688f98ac013f775cdf186578018f926ac329070541Mark Wei } else { 6900bbdef40b1d1e5fda3ac9157550f2da74b37163Rohan Shah return new MultiFoldersSelectionDialog( 708f98ac013f775cdf186578018f926ac329070541Mark Wei context, account, updater, target, isBatch, currentFolder); 718f98ac013f775cdf186578018f926ac329070541Mark Wei } 729eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei } 739eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei 749eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei public static void setDialogDismissed() { 758f98ac013f775cdf186578018f926ac329070541Mark Wei LogUtils.d(LOG_TAG, "Folder Selection dialog dismissed"); 769eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei sDialogShown = false; 779eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei } 789eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei 798f98ac013f775cdf186578018f926ac329070541Mark Wei protected abstract void updateAdapterInBackground(Context context); 808f98ac013f775cdf186578018f926ac329070541Mark Wei 818f98ac013f775cdf186578018f926ac329070541Mark Wei protected abstract void onListItemClick(int position); 828f98ac013f775cdf186578018f926ac329070541Mark Wei 83e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy protected FolderSelectionDialog(final Context context, final Account account, 84e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy final ConversationUpdater updater, final Collection<Conversation> target, 85e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy final boolean isBatch, final Folder currentFolder) { 868f98ac013f775cdf186578018f926ac329070541Mark Wei mUpdater = updater; 878f98ac013f775cdf186578018f926ac329070541Mark Wei mTarget = target; 888f98ac013f775cdf186578018f926ac329070541Mark Wei mBatch = isBatch; 898f98ac013f775cdf186578018f926ac329070541Mark Wei 908f98ac013f775cdf186578018f926ac329070541Mark Wei final AlertDialog.Builder builder = new AlertDialog.Builder(context); 918f98ac013f775cdf186578018f926ac329070541Mark Wei builder.setNegativeButton(R.string.cancel, this); 928f98ac013f775cdf186578018f926ac329070541Mark Wei mAccount = account; 938f98ac013f775cdf186578018f926ac329070541Mark Wei mBuilder = builder; 948f98ac013f775cdf186578018f926ac329070541Mark Wei mCurrentFolder = currentFolder; 958f98ac013f775cdf186578018f926ac329070541Mark Wei mAdapter = new SeparatedFolderListAdapter(context); 968f98ac013f775cdf186578018f926ac329070541Mark Wei mRunner = new QueryRunner(context); 978f98ac013f775cdf186578018f926ac329070541Mark Wei } 988f98ac013f775cdf186578018f926ac329070541Mark Wei 999eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei public void show() { 1008f98ac013f775cdf186578018f926ac329070541Mark Wei sDialogShown = true; 1018f98ac013f775cdf186578018f926ac329070541Mark Wei mRunner.execute(); 1028f98ac013f775cdf186578018f926ac329070541Mark Wei } 1038f98ac013f775cdf186578018f926ac329070541Mark Wei 1048f98ac013f775cdf186578018f926ac329070541Mark Wei protected void showInternal() { 1058f98ac013f775cdf186578018f926ac329070541Mark Wei mDialog.show(); 1068f98ac013f775cdf186578018f926ac329070541Mark Wei mDialog.setOnDismissListener(this); 1078f98ac013f775cdf186578018f926ac329070541Mark Wei mDialog.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { 1088f98ac013f775cdf186578018f926ac329070541Mark Wei @Override 1098f98ac013f775cdf186578018f926ac329070541Mark Wei public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 1108f98ac013f775cdf186578018f926ac329070541Mark Wei onListItemClick(position); 1118f98ac013f775cdf186578018f926ac329070541Mark Wei } 1128f98ac013f775cdf186578018f926ac329070541Mark Wei }); 1139eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei } 1149eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei 1159eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei @Override 1169eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei public void onDismiss(DialogInterface dialog) { 1179eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei FolderSelectionDialog.setDialogDismissed(); 1189eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei } 1198f98ac013f775cdf186578018f926ac329070541Mark Wei 1208f98ac013f775cdf186578018f926ac329070541Mark Wei /** 1218f98ac013f775cdf186578018f926ac329070541Mark Wei * Class to query the Folder list database in the background and update the 1228f98ac013f775cdf186578018f926ac329070541Mark Wei * adapter with an open cursor. 1238f98ac013f775cdf186578018f926ac329070541Mark Wei */ 1248f98ac013f775cdf186578018f926ac329070541Mark Wei private class QueryRunner extends AsyncTask<Void, Void, Void> { 1258f98ac013f775cdf186578018f926ac329070541Mark Wei private final Context mContext; 1268f98ac013f775cdf186578018f926ac329070541Mark Wei 1278f98ac013f775cdf186578018f926ac329070541Mark Wei private QueryRunner(final Context context) { 1288f98ac013f775cdf186578018f926ac329070541Mark Wei mContext = context; 1298f98ac013f775cdf186578018f926ac329070541Mark Wei } 1308f98ac013f775cdf186578018f926ac329070541Mark Wei 1318f98ac013f775cdf186578018f926ac329070541Mark Wei @Override 1328f98ac013f775cdf186578018f926ac329070541Mark Wei protected Void doInBackground(Void... v) { 1338f98ac013f775cdf186578018f926ac329070541Mark Wei updateAdapterInBackground(mContext); 1348f98ac013f775cdf186578018f926ac329070541Mark Wei return null; 1358f98ac013f775cdf186578018f926ac329070541Mark Wei } 1368f98ac013f775cdf186578018f926ac329070541Mark Wei 1378f98ac013f775cdf186578018f926ac329070541Mark Wei @Override 1388f98ac013f775cdf186578018f926ac329070541Mark Wei protected void onPostExecute(Void v) { 1398f98ac013f775cdf186578018f926ac329070541Mark Wei mDialog = mBuilder.create(); 1408f98ac013f775cdf186578018f926ac329070541Mark Wei showInternal(); 1418f98ac013f775cdf186578018f926ac329070541Mark Wei } 1428f98ac013f775cdf186578018f926ac329070541Mark Wei } 1439eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei} 144