• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {
SingleFolderSelectionDialog()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
onCreate(Bundle savedInstanceState)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
onListItemClick(int position)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
onClick(DialogInterface dialog, int which)134     public void onClick(DialogInterface dialog, int which) {
135         // Do nothing.
136     }
137 }
138