169e84ac6559e341947d8694fb10bff697332540eMindy Pereira/*******************************************************************************
269e84ac6559e341947d8694fb10bff697332540eMindy Pereira *      Copyright (C) 2012 Google Inc.
369e84ac6559e341947d8694fb10bff697332540eMindy Pereira *      Licensed to The Android Open Source Project.
469e84ac6559e341947d8694fb10bff697332540eMindy Pereira *
569e84ac6559e341947d8694fb10bff697332540eMindy Pereira *      Licensed under the Apache License, Version 2.0 (the "License");
669e84ac6559e341947d8694fb10bff697332540eMindy Pereira *      you may not use this file except in compliance with the License.
769e84ac6559e341947d8694fb10bff697332540eMindy Pereira *      You may obtain a copy of the License at
869e84ac6559e341947d8694fb10bff697332540eMindy Pereira *
969e84ac6559e341947d8694fb10bff697332540eMindy Pereira *           http://www.apache.org/licenses/LICENSE-2.0
1069e84ac6559e341947d8694fb10bff697332540eMindy Pereira *
1169e84ac6559e341947d8694fb10bff697332540eMindy Pereira *      Unless required by applicable law or agreed to in writing, software
1269e84ac6559e341947d8694fb10bff697332540eMindy Pereira *      distributed under the License is distributed on an "AS IS" BASIS,
1369e84ac6559e341947d8694fb10bff697332540eMindy Pereira *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1469e84ac6559e341947d8694fb10bff697332540eMindy Pereira *      See the License for the specific language governing permissions and
1569e84ac6559e341947d8694fb10bff697332540eMindy Pereira *      limitations under the License.
1669e84ac6559e341947d8694fb10bff697332540eMindy Pereira *******************************************************************************/
1769e84ac6559e341947d8694fb10bff697332540eMindy Pereira
1869e84ac6559e341947d8694fb10bff697332540eMindy Pereirapackage com.android.mail.ui;
1969e84ac6559e341947d8694fb10bff697332540eMindy Pereira
2069e84ac6559e341947d8694fb10bff697332540eMindy Pereiraimport android.content.Context;
2169e84ac6559e341947d8694fb10bff697332540eMindy Pereiraimport android.database.Cursor;
2269e84ac6559e341947d8694fb10bff697332540eMindy Pereiraimport android.database.MatrixCursor;
2374098779f90c61487ff0b5bbb7a458f0a8818047Jin Caoimport android.net.Uri;
24739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy
25739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedyimport com.android.mail.providers.Folder;
2669e84ac6559e341947d8694fb10bff697332540eMindy Pereiraimport com.android.mail.providers.UIProvider;
2774098779f90c61487ff0b5bbb7a458f0a8818047Jin Caoimport com.android.mail.utils.FolderUri;
28384b8de1a1e18b29fe392151b06ce6fbe07be4bdScott Kennedyimport com.android.mail.utils.MatrixCursorWithCachedColumns;
2969e84ac6559e341947d8694fb10bff697332540eMindy Pereira
3069e84ac6559e341947d8694fb10bff697332540eMindy Pereiraimport java.util.Set;
3169e84ac6559e341947d8694fb10bff697332540eMindy Pereira
3269e84ac6559e341947d8694fb10bff697332540eMindy Pereirapublic class AddableFolderSelectorAdapter extends FolderSelectorAdapter {
3369e84ac6559e341947d8694fb10bff697332540eMindy Pereira
3469e84ac6559e341947d8694fb10bff697332540eMindy Pereira    public AddableFolderSelectorAdapter(Context context, Cursor folders,
35106a12a1b6642e8c2f716aefa846d9664fbec158Andrew Sapperstein            Set<String> selected, int layout) {
36106a12a1b6642e8c2f716aefa846d9664fbec158Andrew Sapperstein        super(context, folders, selected, layout);
3769e84ac6559e341947d8694fb10bff697332540eMindy Pereira    }
3869e84ac6559e341947d8694fb10bff697332540eMindy Pereira
3974098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao    /**
4074098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao     * Essentially uses filterFolders with no filter to convert the cursors
4174098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao     */
4274098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao    public static Cursor filterFolders(final Cursor folderCursor) {
4374098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao        return filterFolders(folderCursor, null /* excludedTypes */, null /* initiallySelected */,
4474098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                true /* includeInitiallySelected, useless in this case */);
4574098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao    }
4674098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao
4774098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao    /**
4874098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao     * @param folderCursor
4974098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao     * @param excludedTypes folder types that we want to filter out.
5074098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao     * @param initiallySelected set of folder uris that are previously selected.
518300fe7192c5511c2de7fca1e4abb198c06678b2Jin Cao     * @param includeOnlyInitiallySelected if we want to ONLY include or exclude initiallySelected,
5274098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao     *   doesn't do anything if initiallySelected is null.
5374098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao     * @return
5474098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao     */
55e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy    public static Cursor filterFolders(final Cursor folderCursor,
5674098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao            final Set<Integer> excludedTypes, final Set<String> initiallySelected,
5774098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao            final boolean includeOnlyInitiallySelected) {
5869e84ac6559e341947d8694fb10bff697332540eMindy Pereira        final int projectionSize = UIProvider.FOLDERS_PROJECTION.length;
59384b8de1a1e18b29fe392151b06ce6fbe07be4bdScott Kennedy        final MatrixCursor cursor =
60384b8de1a1e18b29fe392151b06ce6fbe07be4bdScott Kennedy                new MatrixCursorWithCachedColumns(UIProvider.FOLDERS_PROJECTION);
61e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy        final Object[] folder = new Object[projectionSize];
62a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp        if (folderCursor.moveToFirst()) {
63a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp            do {
64e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy                final int type = folderCursor.getInt(UIProvider.FOLDER_TYPE_COLUMN);
65e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy
6674098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                // Check for excluded types
6774098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                boolean exclude = false;
68e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy                if (excludedTypes != null) {
69e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy                    for (final int excludedType : excludedTypes) {
70e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy                        if (Folder.isType(type, excludedType)) {
71e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy                            exclude = true;
72e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy                            break;
73e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy                        }
74e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy                    }
7574098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                }
76e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy
7774098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                if (initiallySelected != null) {
7874098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                    // TODO: there has to be a better way to get this value...
7974098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                    String uri = new FolderUri(Uri.parse(folderCursor.getString(
8074098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                            UIProvider.FOLDER_URI_COLUMN))).getComparisonUri().toString();
8174098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                    // Check if the folder is already selected and if we are trying to include only
8274098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                    // the ones that were initially selected or only the ones that aren't.
8374098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                    // Xor is what we want, since we essentially want the following:
8474098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                    // (includeOnlyInitial && !contains) || (!includeOnlyInitial && contains)
8574098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                    exclude |= includeOnlyInitiallySelected ^ initiallySelected.contains(uri);
8674098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                }
8774098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao
8874098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                if (exclude) {
8974098779f90c61487ff0b5bbb7a458f0a8818047Jin Cao                    continue;
90e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy                }
91e7e0163126fa81af58ae6dbffc20adb610580fe2Scott Kennedy
92739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy                if (Folder.isType(type, UIProvider.FolderType.INBOX)
93739850b9cb73a0b1868077d71696395c43f8bf80Scott Kennedy                        || Folder.isType(type, UIProvider.FolderType.DEFAULT)) {
94a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_ID_COLUMN] = folderCursor
95a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getLong(UIProvider.FOLDER_ID_COLUMN);
96d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                    folder[UIProvider.FOLDER_PERSISTENT_ID_COLUMN] = folderCursor
97d5edd2d02649dffb40065fdb6a16acf91552b800Scott Kennedy                            .getString(UIProvider.FOLDER_PERSISTENT_ID_COLUMN);
98a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_URI_COLUMN] = folderCursor
99a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getString(UIProvider.FOLDER_URI_COLUMN);
100a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_NAME_COLUMN] = folderCursor
101a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getString(UIProvider.FOLDER_NAME_COLUMN);
102a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_HAS_CHILDREN_COLUMN] = folderCursor
103a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getInt(UIProvider.FOLDER_HAS_CHILDREN_COLUMN);
104a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_CAPABILITIES_COLUMN] = folderCursor
105a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getInt(UIProvider.FOLDER_CAPABILITIES_COLUMN);
106a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_SYNC_WINDOW_COLUMN] = folderCursor
107a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getInt(UIProvider.FOLDER_SYNC_WINDOW_COLUMN);
108a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_CONVERSATION_LIST_URI_COLUMN] = folderCursor
109a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getString(UIProvider.FOLDER_CONVERSATION_LIST_URI_COLUMN);
110a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_CHILD_FOLDERS_LIST_COLUMN] = folderCursor
111a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getString(UIProvider.FOLDER_CHILD_FOLDERS_LIST_COLUMN);
11261bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy                    folder[UIProvider.FOLDER_UNSEEN_COUNT_COLUMN] = folderCursor
11361bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy                            .getInt(UIProvider.FOLDER_UNSEEN_COUNT_COLUMN);
114a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_UNREAD_COUNT_COLUMN] = folderCursor
115a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getInt(UIProvider.FOLDER_UNREAD_COUNT_COLUMN);
116a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_TOTAL_COUNT_COLUMN] = folderCursor
117a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getInt(UIProvider.FOLDER_TOTAL_COUNT_COLUMN);
118a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_REFRESH_URI_COLUMN] = folderCursor
119a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getString(UIProvider.FOLDER_REFRESH_URI_COLUMN);
120a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_SYNC_STATUS_COLUMN] = folderCursor
121a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getInt(UIProvider.FOLDER_SYNC_STATUS_COLUMN);
122a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_LAST_SYNC_RESULT_COLUMN] = folderCursor
123a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getInt(UIProvider.FOLDER_LAST_SYNC_RESULT_COLUMN);
124a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_TYPE_COLUMN] = type;
125a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_ICON_RES_ID_COLUMN] = folderCursor
12661bd0e84a3b0545a722bbfe931233b47afdf52e2Scott Kennedy                            .getInt(UIProvider.FOLDER_ICON_RES_ID_COLUMN);
127a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_BG_COLOR_COLUMN] = folderCursor
128a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getString(UIProvider.FOLDER_BG_COLOR_COLUMN);
129a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_FG_COLOR_COLUMN] = folderCursor
130a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getString(UIProvider.FOLDER_FG_COLOR_COLUMN);
131a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_LOAD_MORE_URI_COLUMN] = folderCursor
132a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getString(UIProvider.FOLDER_LOAD_MORE_URI_COLUMN);
133a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    folder[UIProvider.FOLDER_HIERARCHICAL_DESC_COLUMN] = folderCursor
134a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                            .getString(UIProvider.FOLDER_HIERARCHICAL_DESC_COLUMN);
1357c8325de829ca029ce4547e4f0fa266124301367Scott Kennedy                    folder[UIProvider.FOLDER_LAST_MESSAGE_TIMESTAMP_COLUMN] = folderCursor
136a300d3acd659d349cd2c82af9334adb4c245536bScott Kennedy                            .getLong(UIProvider.FOLDER_LAST_MESSAGE_TIMESTAMP_COLUMN);
137a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal                    folder[UIProvider.FOLDER_PARENT_URI_COLUMN] = folderCursor
138a3bbac02817b12e7641ba67f95d60ecd7794b500Vikram Aggarwal                            .getString(UIProvider.FOLDER_PARENT_URI_COLUMN);
139a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                    cursor.addRow(folder);
140a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp                }
141a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp            } while (folderCursor.moveToNext());
142a6f1e1013f234123eb52bc3e36228a0cffb76092mindyp        }
14369e84ac6559e341947d8694fb10bff697332540eMindy Pereira        return cursor;
14469e84ac6559e341947d8694fb10bff697332540eMindy Pereira    }
14569e84ac6559e341947d8694fb10bff697332540eMindy Pereira}
146