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