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