• 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.content.Context;
21 import android.database.Cursor;
22 import android.database.MatrixCursor;
23 import android.net.Uri;
24 
25 import com.android.mail.providers.Folder;
26 import com.android.mail.providers.UIProvider;
27 import com.android.mail.utils.FolderUri;
28 import com.android.mail.utils.MatrixCursorWithCachedColumns;
29 
30 import java.util.Set;
31 
32 public class AddableFolderSelectorAdapter extends FolderSelectorAdapter {
33 
AddableFolderSelectorAdapter(Context context, Cursor folders, Set<String> selected, int layout)34     public AddableFolderSelectorAdapter(Context context, Cursor folders,
35             Set<String> selected, int layout) {
36         super(context, folders, selected, layout);
37     }
38 
39     /**
40      * Essentially uses filterFolders with no filter to convert the cursors
41      */
filterFolders(final Cursor folderCursor)42     public static Cursor filterFolders(final Cursor folderCursor) {
43         return filterFolders(folderCursor, null /* excludedTypes */, null /* initiallySelected */,
44                 true /* includeInitiallySelected, useless in this case */);
45     }
46 
47     /**
48      * @param folderCursor
49      * @param excludedTypes folder types that we want to filter out.
50      * @param initiallySelected set of folder uris that are previously selected.
51      * @param includeOnlyInitiallySelected if we want to ONLY include or exclude initiallySelected,
52      *   doesn't do anything if initiallySelected is null.
53      * @return
54      */
filterFolders(final Cursor folderCursor, final Set<Integer> excludedTypes, final Set<String> initiallySelected, final boolean includeOnlyInitiallySelected)55     public static Cursor filterFolders(final Cursor folderCursor,
56             final Set<Integer> excludedTypes, final Set<String> initiallySelected,
57             final boolean includeOnlyInitiallySelected) {
58         final int projectionSize = UIProvider.FOLDERS_PROJECTION.length;
59         final MatrixCursor cursor =
60                 new MatrixCursorWithCachedColumns(UIProvider.FOLDERS_PROJECTION);
61         final Object[] folder = new Object[projectionSize];
62         if (folderCursor.moveToFirst()) {
63             do {
64                 final int type = folderCursor.getInt(UIProvider.FOLDER_TYPE_COLUMN);
65 
66                 // Check for excluded types
67                 boolean exclude = false;
68                 if (excludedTypes != null) {
69                     for (final int excludedType : excludedTypes) {
70                         if (Folder.isType(type, excludedType)) {
71                             exclude = true;
72                             break;
73                         }
74                     }
75                 }
76 
77                 if (initiallySelected != null) {
78                     // TODO: there has to be a better way to get this value...
79                     String uri = new FolderUri(Uri.parse(folderCursor.getString(
80                             UIProvider.FOLDER_URI_COLUMN))).getComparisonUri().toString();
81                     // Check if the folder is already selected and if we are trying to include only
82                     // the ones that were initially selected or only the ones that aren't.
83                     // Xor is what we want, since we essentially want the following:
84                     // (includeOnlyInitial && !contains) || (!includeOnlyInitial && contains)
85                     exclude |= includeOnlyInitiallySelected ^ initiallySelected.contains(uri);
86                 }
87 
88                 if (exclude) {
89                     continue;
90                 }
91 
92                 if (Folder.isType(type, UIProvider.FolderType.INBOX)
93                         || Folder.isType(type, UIProvider.FolderType.DEFAULT)) {
94                     folder[UIProvider.FOLDER_ID_COLUMN] = folderCursor
95                             .getLong(UIProvider.FOLDER_ID_COLUMN);
96                     folder[UIProvider.FOLDER_PERSISTENT_ID_COLUMN] = folderCursor
97                             .getString(UIProvider.FOLDER_PERSISTENT_ID_COLUMN);
98                     folder[UIProvider.FOLDER_URI_COLUMN] = folderCursor
99                             .getString(UIProvider.FOLDER_URI_COLUMN);
100                     folder[UIProvider.FOLDER_NAME_COLUMN] = folderCursor
101                             .getString(UIProvider.FOLDER_NAME_COLUMN);
102                     folder[UIProvider.FOLDER_HAS_CHILDREN_COLUMN] = folderCursor
103                             .getInt(UIProvider.FOLDER_HAS_CHILDREN_COLUMN);
104                     folder[UIProvider.FOLDER_CAPABILITIES_COLUMN] = folderCursor
105                             .getInt(UIProvider.FOLDER_CAPABILITIES_COLUMN);
106                     folder[UIProvider.FOLDER_SYNC_WINDOW_COLUMN] = folderCursor
107                             .getInt(UIProvider.FOLDER_SYNC_WINDOW_COLUMN);
108                     folder[UIProvider.FOLDER_CONVERSATION_LIST_URI_COLUMN] = folderCursor
109                             .getString(UIProvider.FOLDER_CONVERSATION_LIST_URI_COLUMN);
110                     folder[UIProvider.FOLDER_CHILD_FOLDERS_LIST_COLUMN] = folderCursor
111                             .getString(UIProvider.FOLDER_CHILD_FOLDERS_LIST_COLUMN);
112                     folder[UIProvider.FOLDER_UNSEEN_COUNT_COLUMN] = folderCursor
113                             .getInt(UIProvider.FOLDER_UNSEEN_COUNT_COLUMN);
114                     folder[UIProvider.FOLDER_UNREAD_COUNT_COLUMN] = folderCursor
115                             .getInt(UIProvider.FOLDER_UNREAD_COUNT_COLUMN);
116                     folder[UIProvider.FOLDER_TOTAL_COUNT_COLUMN] = folderCursor
117                             .getInt(UIProvider.FOLDER_TOTAL_COUNT_COLUMN);
118                     folder[UIProvider.FOLDER_REFRESH_URI_COLUMN] = folderCursor
119                             .getString(UIProvider.FOLDER_REFRESH_URI_COLUMN);
120                     folder[UIProvider.FOLDER_SYNC_STATUS_COLUMN] = folderCursor
121                             .getInt(UIProvider.FOLDER_SYNC_STATUS_COLUMN);
122                     folder[UIProvider.FOLDER_LAST_SYNC_RESULT_COLUMN] = folderCursor
123                             .getInt(UIProvider.FOLDER_LAST_SYNC_RESULT_COLUMN);
124                     folder[UIProvider.FOLDER_TYPE_COLUMN] = type;
125                     folder[UIProvider.FOLDER_ICON_RES_ID_COLUMN] = folderCursor
126                             .getInt(UIProvider.FOLDER_ICON_RES_ID_COLUMN);
127                     folder[UIProvider.FOLDER_BG_COLOR_COLUMN] = folderCursor
128                             .getString(UIProvider.FOLDER_BG_COLOR_COLUMN);
129                     folder[UIProvider.FOLDER_FG_COLOR_COLUMN] = folderCursor
130                             .getString(UIProvider.FOLDER_FG_COLOR_COLUMN);
131                     folder[UIProvider.FOLDER_LOAD_MORE_URI_COLUMN] = folderCursor
132                             .getString(UIProvider.FOLDER_LOAD_MORE_URI_COLUMN);
133                     folder[UIProvider.FOLDER_HIERARCHICAL_DESC_COLUMN] = folderCursor
134                             .getString(UIProvider.FOLDER_HIERARCHICAL_DESC_COLUMN);
135                     folder[UIProvider.FOLDER_LAST_MESSAGE_TIMESTAMP_COLUMN] = folderCursor
136                             .getLong(UIProvider.FOLDER_LAST_MESSAGE_TIMESTAMP_COLUMN);
137                     folder[UIProvider.FOLDER_PARENT_URI_COLUMN] = folderCursor
138                             .getString(UIProvider.FOLDER_PARENT_URI_COLUMN);
139                     cursor.addRow(folder);
140                 }
141             } while (folderCursor.moveToNext());
142         }
143         return cursor;
144     }
145 }
146