/* * 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.OnClickListener; import android.content.DialogInterface.OnMultiChoiceClickListener; import android.database.Cursor; import android.view.View; import android.widget.AdapterView; import com.android.mail.R; import com.android.mail.providers.Account; 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.HierarchicalFolderSelectorAdapter; import com.android.mail.ui.SeparatedFolderListAdapter; import java.util.HashMap; import java.util.HashSet; import java.util.Map.Entry; public class FolderSelectionDialog implements OnClickListener, OnMultiChoiceClickListener { private AlertDialog mDialog; private HashMap mCheckedState; private SeparatedFolderListAdapter mAdapter; final private FolderPickerCallback mCallback; public FolderSelectionDialog(final Context context, Account account, FolderPickerCallback callback) { mCallback = callback; // Mapping of a folder's uri to its checked state mCheckedState = new HashMap(); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(R.string.trash_folder_selection_title); builder.setPositiveButton(R.string.ok, this); builder.setNegativeButton(R.string.create_new_folder, this); final Cursor foldersCursor = context.getContentResolver().query( account.fullFolderListUri != null ? account.fullFolderListUri : account.folderListUri, UIProvider.FOLDERS_PROJECTION, null, null, null); try { mAdapter = new SeparatedFolderListAdapter(context); String[] headers = context.getResources() .getStringArray(R.array.moveto_folder_sections); mAdapter.addSection(headers[2], new HierarchicalFolderSelectorAdapter(context, foldersCursor, new HashSet(), true)); 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) { Object item = mAdapter.getItem(position); if (item instanceof FolderRow) { update((FolderRow) item); } } }); } /** * 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.isPresent(); 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).setIsPresent(false); } } mCheckedState.clear(); row.setIsPresent(add); mAdapter.notifyDataSetChanged(); mCheckedState.put(row.getFolder(), add); } @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case DialogInterface.BUTTON_POSITIVE: Folder folder = null; for (Entry entry : mCheckedState.entrySet()) { if (entry.getValue()) { folder = entry.getKey(); break; } } mCallback.select(folder); break; case DialogInterface.BUTTON_NEGATIVE: mCallback.create(); 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); } }