Home | History | Annotate | Download | only in ui
      1 /*
      2  * Copyright (C) 2012 Google Inc.
      3  * Licensed to The Android Open Source Project.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 package com.android.mail.ui;
     19 
     20 import android.app.AlertDialog;
     21 import android.app.LoaderManager;
     22 import android.content.Context;
     23 import android.content.CursorLoader;
     24 import android.content.DialogInterface;
     25 import android.content.Loader;
     26 import android.database.Cursor;
     27 import android.net.Uri;
     28 import android.os.Bundle;
     29 
     30 import com.android.mail.R;
     31 import com.android.mail.providers.Folder;
     32 import com.android.mail.providers.UIProvider;
     33 import com.android.mail.ui.FolderSelectorAdapter.FolderRow;
     34 import com.android.mail.utils.Utils;
     35 
     36 import java.util.ArrayList;
     37 
     38 /**
     39  * Displays a folder selection dialog for the conversation provided. It allows
     40  * the user to switch a conversation from one folder to another.
     41  */
     42 public class SingleFolderSelectionDialog extends FolderSelectionDialog {
     43     public SingleFolderSelectionDialog() {}
     44 
     45     private static final int FOLDER_LOADER_ID = 0;
     46     private static final String FOLDER_QUERY_URI_TAG = "folderQueryUri";
     47 
     48     @Override
     49     public void onCreate(Bundle savedInstanceState) {
     50         super.onCreate(savedInstanceState);
     51 
     52         mTitleId = R.string.move_to_selection_dialog_title;
     53 
     54         final Bundle args = new Bundle(1);
     55         args.putParcelable(FOLDER_QUERY_URI_TAG, !Utils.isEmpty(mAccount.fullFolderListUri) ?
     56                 mAccount.fullFolderListUri : mAccount.folderListUri);
     57         final Context loaderContext = getActivity().getApplicationContext();
     58         getLoaderManager().initLoader(FOLDER_LOADER_ID, args,
     59                 new LoaderManager.LoaderCallbacks<Cursor>() {
     60                     @Override
     61                     public Loader<Cursor> onCreateLoader(int id, Bundle args) {
     62                         final Uri queryUri = args.getParcelable(FOLDER_QUERY_URI_TAG);
     63                         return new CursorLoader(loaderContext, queryUri,
     64                                 UIProvider.FOLDERS_PROJECTION, null, null, null);
     65                     }
     66 
     67                     @Override
     68                     public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
     69                         final Context context = getActivity();
     70                         if (data == null || context == null) {
     71                             return;
     72                         }
     73 
     74                         final AlertDialog dialog = (AlertDialog) getDialog();
     75                         if (dialog == null) {
     76                             // This could happen if the dialog is dismissed just before the
     77                             // load finishes.
     78                             return;
     79                         }
     80                         // The number of view types changes here, so we have to reset the ListView's
     81                         // adapter.
     82                         dialog.getListView().setAdapter(null);
     83                         dialog.getListView().setDivider(null);
     84 
     85                         mAdapter.clearSections();
     86 
     87                         // Create a system folder adapter and an adapter for hierarchical
     88                         // and user folders. If there are no folders added to either of them,
     89                         // do not add as a section since a 0-count adapter will result in an
     90                         // IndexOutOfBoundsException.
     91                         SystemFolderSelectorAdapter sysFolderAdapter =
     92                                 new SystemFolderSelectorAdapter(context, data,
     93                                     R.layout.single_folders_view, mCurrentFolder);
     94                         if (sysFolderAdapter.getCount() > 0) {
     95                             mAdapter.addSection(sysFolderAdapter);
     96                         }
     97 
     98                         // TODO(pwestbro): determine if we need to call filterFolders
     99                         // if filterFolders is not necessary, remove the method decl with one arg.
    100                         UserFolderHierarchicalFolderSelectorAdapter hierarchicalAdapter =
    101                                 new UserFolderHierarchicalFolderSelectorAdapter(context,
    102                                     AddableFolderSelectorAdapter.filterFolders(data),
    103                                     R.layout.single_folders_view, mCurrentFolder);
    104                         if (hierarchicalAdapter.getCount() > 0) {
    105                             mAdapter.addSection(hierarchicalAdapter);
    106                         }
    107 
    108                         dialog.getListView().setAdapter(mAdapter);
    109                     }
    110 
    111                     @Override
    112                     public void onLoaderReset(Loader<Cursor> loader) {
    113                         mAdapter.clearSections();
    114                     }
    115                 });
    116     }
    117 
    118     @Override
    119     protected void onListItemClick(int position) {
    120         final Object item = mAdapter.getItem(position);
    121         if (item instanceof FolderRow) {
    122             final Folder folder = ((FolderRow) item).getFolder();
    123             ArrayList<FolderOperation> ops = new ArrayList<FolderOperation>();
    124             // Remove the current folder and add the new folder.
    125             ops.add(new FolderOperation(mCurrentFolder, false));
    126             ops.add(new FolderOperation(folder, true));
    127             getConversationUpdater()
    128                     .assignFolder(ops, mTarget, mBatch, true /* showUndo */, true /* isMoveTo */);
    129             dismiss();
    130         }
    131     }
    132 
    133     @Override
    134     public void onClick(DialogInterface dialog, int which) {
    135         // Do nothing.
    136     }
    137 }
    138