blob: a61ded0ff83c472688995fca041635d734a6fd18 [file] [log] [blame]
/*
* 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.mail.ui;
import android.app.AlertDialog;
import android.app.LoaderManager;
import android.content.Context;
import android.content.CursorLoader;
import android.content.DialogInterface;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import com.android.mail.R;
import com.android.mail.providers.Folder;
import com.android.mail.providers.UIProvider;
import com.android.mail.ui.FolderSelectorAdapter.FolderRow;
import com.android.mail.utils.Utils;
import java.util.ArrayList;
/**
* Displays a folder selection dialog for the conversation provided. It allows
* the user to switch a conversation from one folder to another.
*/
public class SingleFolderSelectionDialog extends FolderSelectionDialog {
public SingleFolderSelectionDialog() {}
private static final int FOLDER_LOADER_ID = 0;
private static final String FOLDER_QUERY_URI_TAG = "folderQueryUri";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTitleId = R.string.move_to_selection_dialog_title;
final Bundle args = new Bundle(1);
args.putParcelable(FOLDER_QUERY_URI_TAG, !Utils.isEmpty(mAccount.fullFolderListUri) ?
mAccount.fullFolderListUri : mAccount.folderListUri);
final Context loaderContext = getActivity().getApplicationContext();
getLoaderManager().initLoader(FOLDER_LOADER_ID, args,
new LoaderManager.LoaderCallbacks<Cursor>() {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
final Uri queryUri = args.getParcelable(FOLDER_QUERY_URI_TAG);
return new CursorLoader(loaderContext, queryUri,
UIProvider.FOLDERS_PROJECTION, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
final Context context = getActivity();
if (data == null || context == null) {
return;
}
final AlertDialog dialog = (AlertDialog) getDialog();
if (dialog == null) {
// This could happen if the dialog is dismissed just before the
// load finishes.
return;
}
// The number of view types changes here, so we have to reset the ListView's
// adapter.
dialog.getListView().setAdapter(null);
mAdapter.clearSections();
// Create a system folder adapter and an adapter for hierarchical
// and user folders. If there are no folders added to either of them,
// do not add as a section since a 0-count adapter will result in an
// IndexOutOfBoundsException.
SystemFolderSelectorAdapter sysFolderAdapter =
new SystemFolderSelectorAdapter(context, data,
R.layout.single_folders_view, mCurrentFolder);
if (sysFolderAdapter.getCount() > 0) {
mAdapter.addSection(sysFolderAdapter);
}
// TODO(pwestbro): determine if we need to call filterFolders
// if filterFolders is not necessary, remove the method decl with one arg.
UserFolderHierarchicalFolderSelectorAdapter hierarchicalAdapter =
new UserFolderHierarchicalFolderSelectorAdapter(context,
AddableFolderSelectorAdapter.filterFolders(data),
R.layout.single_folders_view, mCurrentFolder);
if (hierarchicalAdapter.getCount() > 0) {
mAdapter.addSection(hierarchicalAdapter);
}
dialog.getListView().setAdapter(mAdapter);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.clearSections();
}
});
}
@Override
protected void onListItemClick(int position) {
final Object item = mAdapter.getItem(position);
if (item instanceof FolderRow) {
final Folder folder = ((FolderRow) item).getFolder();
ArrayList<FolderOperation> ops = new ArrayList<FolderOperation>();
// Remove the current folder and add the new folder.
ops.add(new FolderOperation(mCurrentFolder, false));
ops.add(new FolderOperation(folder, true));
getConversationUpdater()
.assignFolder(ops, mTarget, mBatch, true /* showUndo */, true /* isMoveTo */);
dismiss();
}
}
@Override
public void onClick(DialogInterface dialog, int which) {
// Do nothing.
}
}