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