diff options
Diffstat (limited to 'provider_src/com/android/email/provider/FolderPickerDialog.java')
-rw-r--r-- | provider_src/com/android/email/provider/FolderPickerDialog.java | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/provider_src/com/android/email/provider/FolderPickerDialog.java b/provider_src/com/android/email/provider/FolderPickerDialog.java new file mode 100644 index 000000000..37a7ed71f --- /dev/null +++ b/provider_src/com/android/email/provider/FolderPickerDialog.java @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2012 Google Inc. + * Licensed to The Android Open Source Project. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.email.provider; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnCancelListener; +import android.content.DialogInterface.OnClickListener; +import android.content.DialogInterface.OnMultiChoiceClickListener; +import android.database.Cursor; +import android.net.Uri; +import android.view.View; +import android.widget.AdapterView; +import android.widget.Button; + +import com.android.mail.R; +import com.android.mail.providers.Folder; +import com.android.mail.providers.UIProvider; +import com.android.mail.ui.FolderSelectorAdapter; +import com.android.mail.ui.FolderSelectorAdapter.FolderRow; +import com.android.mail.ui.SeparatedFolderListAdapter; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map.Entry; + +public class FolderPickerDialog implements OnClickListener, OnMultiChoiceClickListener, + OnCancelListener { + private final AlertDialog mDialog; + private final HashMap<Folder, Boolean> mCheckedState; + private final SeparatedFolderListAdapter mAdapter; + private final FolderPickerCallback mCallback; + + public FolderPickerDialog(final Context context, Uri uri, + FolderPickerCallback callback, String header, boolean cancelable) { + mCallback = callback; + // Mapping of a folder's uri to its checked state + mCheckedState = new HashMap<Folder, Boolean>(); + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(header); + builder.setPositiveButton(R.string.ok, this); + builder.setCancelable(cancelable); + builder.setOnCancelListener(this); + // TODO: Do this on a background thread + final Cursor foldersCursor = context.getContentResolver().query( + uri, UIProvider.FOLDERS_PROJECTION, null, null, null); + try { + mAdapter = new SeparatedFolderListAdapter(); + mAdapter.addSection(new FolderPickerSelectorAdapter(context, foldersCursor, + new HashSet<String>(), R.layout.multi_folders_view)); + builder.setAdapter(mAdapter, this); + } finally { + foldersCursor.close(); + } + mDialog = builder.create(); + } + + public void show() { + mDialog.show(); + mDialog.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + final Object item = mAdapter.getItem(position); + if (item instanceof FolderRow) { + update((FolderRow) item); + } + } + }); + + final Button button = mDialog.getButton(AlertDialog.BUTTON_POSITIVE); + if (mCheckedState.size() == 0) { + // No items are selected, so disable the OK button. + button.setEnabled(false); + } + } + + /** + * Call this to update the state of folders as a result of them being + * selected / de-selected. + * + * @param row The item being updated. + */ + public void update(FolderSelectorAdapter.FolderRow row) { + // Update the UI + final boolean add = !row.isSelected(); + if (!add) { + // This would remove the check on a single radio button, so just + // return. + return; + } + // Clear any other checked items. + mAdapter.getCount(); + for (int i = 0; i < mAdapter.getCount(); i++) { + Object item = mAdapter.getItem(i); + if (item instanceof FolderRow) { + ((FolderRow)item).setIsSelected(false); + } + } + mCheckedState.clear(); + row.setIsSelected(add); + mAdapter.notifyDataSetChanged(); + mCheckedState.put(row.getFolder(), add); + + // Since we know that an item is selected in the list, enable the OK button + final Button button = mDialog.getButton(AlertDialog.BUTTON_POSITIVE); + button.setEnabled(true); + } + + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + Folder folder = null; + for (Entry<Folder, Boolean> entry : mCheckedState.entrySet()) { + if (entry.getValue()) { + folder = entry.getKey(); + break; + } + } + mCallback.select(folder); + break; + default: + onClick(dialog, which, true); + break; + } + } + + @Override + public void onClick(DialogInterface dialog, int which, boolean isChecked) { + final FolderRow row = (FolderRow) mAdapter.getItem(which); + // Clear any other checked items. + mCheckedState.clear(); + isChecked = true; + mCheckedState.put(row.getFolder(), isChecked); + mDialog.getListView().setItemChecked(which, false); + } + + @Override + public void onCancel(DialogInterface dialog) { + mCallback.cancel(); + } +} |