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