2012-06-29 16:42:05 +00:00
|
|
|
/*
|
|
|
|
* 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;
|
2012-09-06 17:19:34 +00:00
|
|
|
import android.content.DialogInterface.OnCancelListener;
|
2012-06-29 16:42:05 +00:00
|
|
|
import android.content.DialogInterface.OnClickListener;
|
|
|
|
import android.content.DialogInterface.OnMultiChoiceClickListener;
|
|
|
|
import android.database.Cursor;
|
2012-09-06 17:19:34 +00:00
|
|
|
import android.net.Uri;
|
2012-06-29 16:42:05 +00:00
|
|
|
import android.view.View;
|
|
|
|
import android.widget.AdapterView;
|
2012-08-08 06:50:38 +00:00
|
|
|
import android.widget.Button;
|
2012-06-29 16:42:05 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2012-09-10 02:07:53 +00:00
|
|
|
public class FolderPickerDialog implements OnClickListener, OnMultiChoiceClickListener,
|
|
|
|
OnCancelListener {
|
2012-08-08 06:50:38 +00:00
|
|
|
private final AlertDialog mDialog;
|
|
|
|
private final HashMap<Folder, Boolean> mCheckedState;
|
|
|
|
private final SeparatedFolderListAdapter mAdapter;
|
|
|
|
private final FolderPickerCallback mCallback;
|
2012-06-29 16:42:05 +00:00
|
|
|
|
2012-09-10 02:07:53 +00:00
|
|
|
public FolderPickerDialog(final Context context, Uri uri,
|
|
|
|
FolderPickerCallback callback, String header, boolean cancelable) {
|
2012-06-29 16:42:05 +00:00
|
|
|
mCallback = callback;
|
|
|
|
// Mapping of a folder's uri to its checked state
|
|
|
|
mCheckedState = new HashMap<Folder, Boolean>();
|
|
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
2012-09-06 17:19:34 +00:00
|
|
|
builder.setTitle(header);
|
2012-06-29 16:42:05 +00:00
|
|
|
builder.setPositiveButton(R.string.ok, this);
|
2012-09-10 02:07:53 +00:00
|
|
|
builder.setCancelable(cancelable);
|
|
|
|
builder.setOnCancelListener(this);
|
2012-09-06 17:19:34 +00:00
|
|
|
// TODO: Do this on a background thread
|
2012-06-29 16:42:05 +00:00
|
|
|
final Cursor foldersCursor = context.getContentResolver().query(
|
2012-09-06 17:19:34 +00:00
|
|
|
uri, UIProvider.FOLDERS_PROJECTION, null, null, null);
|
2012-06-29 16:42:05 +00:00
|
|
|
try {
|
2013-09-20 23:14:04 +00:00
|
|
|
mAdapter = new SeparatedFolderListAdapter();
|
2012-09-18 22:44:24 +00:00
|
|
|
mAdapter.addSection(new FolderPickerSelectorAdapter(context, foldersCursor,
|
2014-07-04 01:21:32 +00:00
|
|
|
new HashSet<String>(), R.layout.multi_folders_view));
|
2012-06-29 16:42:05 +00:00
|
|
|
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) {
|
2012-08-08 06:50:38 +00:00
|
|
|
final Object item = mAdapter.getItem(position);
|
2012-06-29 16:42:05 +00:00
|
|
|
if (item instanceof FolderRow) {
|
|
|
|
update((FolderRow) item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2012-08-08 06:50:38 +00:00
|
|
|
|
|
|
|
final Button button = mDialog.getButton(AlertDialog.BUTTON_POSITIVE);
|
|
|
|
if (mCheckedState.size() == 0) {
|
|
|
|
// No items are selected, so disable the OK button.
|
|
|
|
button.setEnabled(false);
|
|
|
|
}
|
2012-06-29 16:42:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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
|
2014-05-19 19:41:00 +00:00
|
|
|
final boolean add = !row.isSelected();
|
2012-06-29 16:42:05 +00:00
|
|
|
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) {
|
2014-05-19 19:41:00 +00:00
|
|
|
((FolderRow)item).setIsSelected(false);
|
2012-06-29 16:42:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
mCheckedState.clear();
|
2014-05-19 19:41:00 +00:00
|
|
|
row.setIsSelected(add);
|
2012-06-29 16:42:05 +00:00
|
|
|
mAdapter.notifyDataSetChanged();
|
|
|
|
mCheckedState.put(row.getFolder(), add);
|
2012-08-08 06:50:38 +00:00
|
|
|
|
|
|
|
// 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);
|
2012-06-29 16:42:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@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);
|
|
|
|
}
|
2012-09-10 02:07:53 +00:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onCancel(DialogInterface dialog) {
|
|
|
|
mCallback.cancel();
|
|
|
|
}
|
2012-06-29 16:42:05 +00:00
|
|
|
}
|