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; 212a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantlerimport android.app.Dialog; 222a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantlerimport android.app.DialogFragment; 238f98ac013f775cdf186578018f926ac329070541Mark Weiimport android.content.DialogInterface.OnClickListener; 242a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantlerimport android.os.Bundle; 258f98ac013f775cdf186578018f926ac329070541Mark Weiimport android.view.View; 268f98ac013f775cdf186578018f926ac329070541Mark Weiimport android.widget.AdapterView; 279eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei 288f98ac013f775cdf186578018f926ac329070541Mark Weiimport com.android.mail.R; 298f98ac013f775cdf186578018f926ac329070541Mark Weiimport com.android.mail.providers.Account; 308f98ac013f775cdf186578018f926ac329070541Mark Weiimport com.android.mail.providers.Conversation; 318f98ac013f775cdf186578018f926ac329070541Mark Weiimport com.android.mail.providers.Folder; 328f98ac013f775cdf186578018f926ac329070541Mark Weiimport com.android.mail.providers.UIProvider; 338f98ac013f775cdf186578018f926ac329070541Mark Weiimport com.android.mail.utils.LogTag; 349eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei 352a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantlerimport java.util.Arrays; 368f98ac013f775cdf186578018f926ac329070541Mark Weiimport java.util.Collection; 378f98ac013f775cdf186578018f926ac329070541Mark Wei 382a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantlerpublic abstract class FolderSelectionDialog extends DialogFragment implements OnClickListener { 398f98ac013f775cdf186578018f926ac329070541Mark Wei protected static final String LOG_TAG = LogTag.getLogTag(); 408f98ac013f775cdf186578018f926ac329070541Mark Wei 412a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler private static final String ARG_FOLDER_TAG = "folder"; 422a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler private static final String ARG_ACCOUNT_TAG = "account"; 432a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler private static final String ARG_BATCH_TAG = "batch"; 442a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler private static final String ARG_TARGET_TAG = "target"; 452a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler 462a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler protected SeparatedFolderListAdapter mAdapter; 472a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler protected Collection<Conversation> mTarget; 482a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler // True for CAB mode 492a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler protected boolean mBatch; 502a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler protected Account mAccount; 512a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler protected Folder mCurrentFolder; 522a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler protected int mTitleId; 532a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler 542a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler public static FolderSelectionDialog getInstance(final Account account, 552a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler final Collection<Conversation> target, final boolean isBatch, 562a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler final Folder currentFolder, final boolean isMoveTo) { 570cb4aaaadb50664422a2595361d26878ffe5dc04Scott Kennedy /* 580cb4aaaadb50664422a2595361d26878ffe5dc04Scott Kennedy * TODO: This method should only be called with isMoveTo=true if this capability is not 590cb4aaaadb50664422a2595361d26878ffe5dc04Scott Kennedy * present on the account, so we should be able to remove the check here. 600cb4aaaadb50664422a2595361d26878ffe5dc04Scott Kennedy */ 612a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler final FolderSelectionDialog f; 6200bbdef40b1d1e5fda3ac9157550f2da74b37163Rohan Shah if (isMoveTo || !account.supportsCapability( 6300bbdef40b1d1e5fda3ac9157550f2da74b37163Rohan Shah UIProvider.AccountCapabilities.MULTIPLE_FOLDERS_PER_CONV)) { 642a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler f = new SingleFolderSelectionDialog(); 658f98ac013f775cdf186578018f926ac329070541Mark Wei } else { 662a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler f = new MultiFoldersSelectionDialog(); 678f98ac013f775cdf186578018f926ac329070541Mark Wei } 682a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler final Bundle args = new Bundle(4); 692a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler args.putParcelable(ARG_FOLDER_TAG, currentFolder); 702a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler args.putParcelable(ARG_ACCOUNT_TAG, account); 712a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler args.putBoolean(ARG_BATCH_TAG, isBatch); 722a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler args.putParcelableArray(ARG_TARGET_TAG, target.toArray(new Conversation[target.size()])); 732a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler f.setArguments(args); 742a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler return f; 759eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei } 769eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei 778f98ac013f775cdf186578018f926ac329070541Mark Wei protected abstract void onListItemClick(int position); 788f98ac013f775cdf186578018f926ac329070541Mark Wei 792a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler @Override 802a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler public void onCreate(final Bundle savedInstanceState) { 812a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler super.onCreate(savedInstanceState); 8247ce8047c208f3268f31bd7ef7eb5392b670ea8aTony Mantler mAdapter = new SeparatedFolderListAdapter(); 838f98ac013f775cdf186578018f926ac329070541Mark Wei 842a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler final Bundle args = getArguments(); 852a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler 862a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler mCurrentFolder = args.getParcelable(ARG_FOLDER_TAG); 872a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler mAccount = args.getParcelable(ARG_ACCOUNT_TAG); 882a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler mBatch = args.getBoolean(ARG_BATCH_TAG); 892a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler mTarget = Arrays.asList((Conversation[])args.getParcelableArray(ARG_TARGET_TAG)); 908f98ac013f775cdf186578018f926ac329070541Mark Wei } 918f98ac013f775cdf186578018f926ac329070541Mark Wei 922a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler @Override 932a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler public Dialog onCreateDialog(final Bundle savedInstanceState) { 942a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler final AlertDialog dialog = new AlertDialog.Builder(getActivity()) 952a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler .setNegativeButton(R.string.cancel, this) 962a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler .setPositiveButton(R.string.ok, this) 972a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler .setAdapter(mAdapter, this) 982a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler .setTitle(mTitleId) 992a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler .create(); 1002a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler dialog.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { 1012a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler @Override 1028f98ac013f775cdf186578018f926ac329070541Mark Wei public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 1038f98ac013f775cdf186578018f926ac329070541Mark Wei onListItemClick(position); 1048f98ac013f775cdf186578018f926ac329070541Mark Wei } 1058f98ac013f775cdf186578018f926ac329070541Mark Wei }); 1062a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler return dialog; 1079eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei } 1089eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei 1092a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler protected ConversationUpdater getConversationUpdater() { 1102a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler if (!isResumed()) { 1112a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler throw new IllegalStateException( 1122a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler "Tried to update conversations while fragment is not running"); 1138f98ac013f775cdf186578018f926ac329070541Mark Wei } 1142a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler final ControllableActivity activity = (ControllableActivity)getActivity(); 1152a4be2459962700e1a38ba897de5d2f5913412f5Tony Mantler return activity.getConversationUpdater(); 1168f98ac013f775cdf186578018f926ac329070541Mark Wei } 1179eb1c9a76a400f84c002b58c831119119ebf4870Mark Wei} 118