11a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira/* 21a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * Copyright (C) 2012 The Android Open Source Project 31a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * 41a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * Licensed under the Apache License, Version 2.0 (the "License"); 51a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * you may not use this file except in compliance with the License. 61a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * You may obtain a copy of the License at 71a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * 81a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * http://www.apache.org/licenses/LICENSE-2.0 91a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * 101a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * Unless required by applicable law or agreed to in writing, software 111a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS, 121a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * See the License for the specific language governing permissions and 141a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * limitations under the License. 151a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira */ 1630e2c24b056542f3b1b438aeb798305d1226d0c8Andy Huangpackage com.android.mail.utils; 171a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira 1833fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereiraimport com.android.mail.providers.Account; 19c2074c4442eacf5604dd3cecd06b363e8fc574dePaul Westbrookimport com.android.mail.providers.MailAppProvider; 2030e2c24b056542f3b1b438aeb798305d1226d0c8Andy Huangimport com.android.mail.providers.UIProvider; 211a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira 221a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereiraimport android.content.ContentResolver; 231a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereiraimport android.content.Context; 241a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereiraimport android.database.Cursor; 2592227f6b35b3bec54609dc0feb9dd6756c2a43e6Paul Westbrookimport com.google.common.collect.Lists; 261a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira 271a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereiraimport java.util.ArrayList; 281a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereiraimport java.util.List; 291a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira 301a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereirapublic class AccountUtils { 311a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira /** 321a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * Merge two lists of accounts into one list of accounts without duplicates. 331a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * 3426a20758413f0f8629ea71a0943304e3ae740165Tony Mantler * @param inList List of accounts. 351a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * @param accounts Accounts to merge in. 361a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * @param prioritizeAccountList Boolean indicating whether this method 371a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * should prioritize the list of Account objects when merging the 381a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * lists 391a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * @return Merged list of accounts. 401a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira */ 4133fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira public static List<Account> mergeAccountLists(List<Account> inList, Account[] accounts, 421a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira boolean prioritizeAccountList) { 431a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira 4433fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira List<Account> newAccountList = new ArrayList<Account>(); 4533fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira List<String> existingList = new ArrayList<String>(); 4633fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira if (inList != null) { 4733fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira for (Account account : inList) { 4826a20758413f0f8629ea71a0943304e3ae740165Tony Mantler existingList.add(account.getEmailAddress()); 4933fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira } 5033fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira } 511a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira // Make sure the accounts are actually synchronized 521a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira // (we won't be able to save/send for accounts that 531a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira // have never been synchronized) 541a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira for (int i = 0; i < accounts.length; i++) { 5526a20758413f0f8629ea71a0943304e3ae740165Tony Mantler final String accountName = accounts[i].getEmailAddress(); 561a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira // If the account is in the cached list or the caller requested 571a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira // that we prioritize the list of Account objects, put it in the new list 583b965d78774a42358ce6bbdcc43b4c8df130a60eScott Kennedy if (prioritizeAccountList || existingList.contains(accountName)) { 5933fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira newAccountList.add(accounts[i]); 601a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira } 611a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira } 621a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira return newAccountList; 631a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira } 641a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira 651a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira /** 66830bdaf78180d4566a519954cdfd320e20dd529dMindy Pereira * Synchronous method which returns registered accounts that are syncing. 671a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * @param context 681a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira * @return 691a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira */ 7092227f6b35b3bec54609dc0feb9dd6756c2a43e6Paul Westbrook public static Account[] getSyncingAccounts(Context context) { 7192227f6b35b3bec54609dc0feb9dd6756c2a43e6Paul Westbrook final ContentResolver resolver = context.getContentResolver(); 7251b11bd2a2c1ca14f9cb88fe9326485a523e7c14Mindy Pereira Cursor accountsCursor = null; 7392227f6b35b3bec54609dc0feb9dd6756c2a43e6Paul Westbrook final List<Account> accounts = Lists.newArrayList(); 7433fe908589dca6a7f58aa9f56d73f74a48ac42f6Mindy Pereira Account account; 7551b11bd2a2c1ca14f9cb88fe9326485a523e7c14Mindy Pereira try { 76c2074c4442eacf5604dd3cecd06b363e8fc574dePaul Westbrook accountsCursor = resolver.query(MailAppProvider.getAccountsUri(), 7751b11bd2a2c1ca14f9cb88fe9326485a523e7c14Mindy Pereira UIProvider.ACCOUNTS_PROJECTION, null, null, null); 7851b11bd2a2c1ca14f9cb88fe9326485a523e7c14Mindy Pereira if (accountsCursor != null) { 7951b11bd2a2c1ca14f9cb88fe9326485a523e7c14Mindy Pereira while (accountsCursor.moveToNext()) { 804b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen account = Account.builder().buildFrom(accountsCursor); 81dfa1dec0cfdc263c51e971dc3c41b90386a24340Paul Westbrook if (!account.isAccountSyncRequired()) { 825892a78e9ceff33dca1b878aa42a27222ff4526fPaul Westbrook accounts.add(account); 835892a78e9ceff33dca1b878aa42a27222ff4526fPaul Westbrook } 8451b11bd2a2c1ca14f9cb88fe9326485a523e7c14Mindy Pereira } 8551b11bd2a2c1ca14f9cb88fe9326485a523e7c14Mindy Pereira } 8651b11bd2a2c1ca14f9cb88fe9326485a523e7c14Mindy Pereira } finally { 8751b11bd2a2c1ca14f9cb88fe9326485a523e7c14Mindy Pereira if (accountsCursor != null) { 8851b11bd2a2c1ca14f9cb88fe9326485a523e7c14Mindy Pereira accountsCursor.close(); 891a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira } 901a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira } 911a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira return accounts.toArray(new Account[accounts.size()]); 921a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira } 93b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira 94b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira /** 95b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira * Synchronous method which returns registered accounts. 96b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira * @param context 97b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira * @return 98b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira */ 99b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira public static Account[] getAccounts(Context context) { 100b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira final ContentResolver resolver = context.getContentResolver(); 101b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira Cursor accountsCursor = null; 102b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira final List<Account> accounts = Lists.newArrayList(); 103b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira try { 104b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira accountsCursor = resolver.query(MailAppProvider.getAccountsUri(), 105b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira UIProvider.ACCOUNTS_PROJECTION, null, null, null); 106b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira if (accountsCursor != null) { 107b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira while (accountsCursor.moveToNext()) { 1084b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen accounts.add(Account.builder().buildFrom(accountsCursor)); 109b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira } 110b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira } 111b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira } finally { 112b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira if (accountsCursor != null) { 113b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira accountsCursor.close(); 114b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira } 115b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira } 116b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira return accounts.toArray(new Account[accounts.size()]); 117b199d172dcb568e2c09ea60eeb109922eec2f07eMindy Pereira } 1181a95a57f39da84cd7daf4e2161e50e518df51f13Mindy Pereira} 119