PopImapSyncAdapterService.java revision d1a87bc02d65dde9e635848531e09aadc79ff538
15c523858385176c33a7456bb84035de78552d22dMarc Blank/*
25c523858385176c33a7456bb84035de78552d22dMarc Blank * Copyright (C) 2010 The Android Open Source Project
35c523858385176c33a7456bb84035de78552d22dMarc Blank *
45c523858385176c33a7456bb84035de78552d22dMarc Blank * Licensed under the Apache License, Version 2.0 (the "License");
55c523858385176c33a7456bb84035de78552d22dMarc Blank * you may not use this file except in compliance with the License.
65c523858385176c33a7456bb84035de78552d22dMarc Blank * You may obtain a copy of the License at
75c523858385176c33a7456bb84035de78552d22dMarc Blank *
85c523858385176c33a7456bb84035de78552d22dMarc Blank *      http://www.apache.org/licenses/LICENSE-2.0
95c523858385176c33a7456bb84035de78552d22dMarc Blank *
105c523858385176c33a7456bb84035de78552d22dMarc Blank * Unless required by applicable law or agreed to in writing, software
115c523858385176c33a7456bb84035de78552d22dMarc Blank * distributed under the License is distributed on an "AS IS" BASIS,
125c523858385176c33a7456bb84035de78552d22dMarc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135c523858385176c33a7456bb84035de78552d22dMarc Blank * See the License for the specific language governing permissions and
145c523858385176c33a7456bb84035de78552d22dMarc Blank * limitations under the License.
155c523858385176c33a7456bb84035de78552d22dMarc Blank */
165c523858385176c33a7456bb84035de78552d22dMarc Blank
175c523858385176c33a7456bb84035de78552d22dMarc Blankpackage com.android.email.service;
185c523858385176c33a7456bb84035de78552d22dMarc Blank
195c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.accounts.OperationCanceledException;
205c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.app.Service;
215c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.AbstractThreadedSyncAdapter;
225c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.ContentProviderClient;
235c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.ContentResolver;
245c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.ContentUris;
255c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.ContentValues;
265c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.Context;
275c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.Intent;
285c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.SyncResult;
295c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.database.Cursor;
305c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.net.Uri;
315c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.os.Bundle;
325c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.os.IBinder;
335c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.util.Log;
345c523858385176c33a7456bb84035de78552d22dMarc Blank
355c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.email.R;
365c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.TempDirectory;
375c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.mail.MessagingException;
385c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.provider.Account;
395c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.provider.EmailContent;
405c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.provider.EmailContent.AccountColumns;
415c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.provider.EmailContent.Message;
425c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.provider.Mailbox;
435c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.service.EmailServiceProxy;
445c523858385176c33a7456bb84035de78552d22dMarc Blank
455c523858385176c33a7456bb84035de78552d22dMarc Blankimport java.util.ArrayList;
465c523858385176c33a7456bb84035de78552d22dMarc Blank
475c523858385176c33a7456bb84035de78552d22dMarc Blankpublic class PopImapSyncAdapterService extends Service {
48d1a87bc02d65dde9e635848531e09aadc79ff538Paul Westbrook    private static final String TAG = "PopImapSyncService";
496bbbc0d57c6aa074af3967d596ff420622815f17Marc Blank    private static SyncAdapterImpl sSyncAdapter = null;
505c523858385176c33a7456bb84035de78552d22dMarc Blank    private static final Object sSyncAdapterLock = new Object();
515c523858385176c33a7456bb84035de78552d22dMarc Blank
525c523858385176c33a7456bb84035de78552d22dMarc Blank    public PopImapSyncAdapterService() {
535c523858385176c33a7456bb84035de78552d22dMarc Blank        super();
545c523858385176c33a7456bb84035de78552d22dMarc Blank    }
555c523858385176c33a7456bb84035de78552d22dMarc Blank
565c523858385176c33a7456bb84035de78552d22dMarc Blank    private static class SyncAdapterImpl extends AbstractThreadedSyncAdapter {
575c523858385176c33a7456bb84035de78552d22dMarc Blank        private Context mContext;
585c523858385176c33a7456bb84035de78552d22dMarc Blank
595c523858385176c33a7456bb84035de78552d22dMarc Blank        public SyncAdapterImpl(Context context) {
605c523858385176c33a7456bb84035de78552d22dMarc Blank            super(context, true /* autoInitialize */);
615c523858385176c33a7456bb84035de78552d22dMarc Blank            mContext = context;
625c523858385176c33a7456bb84035de78552d22dMarc Blank        }
635c523858385176c33a7456bb84035de78552d22dMarc Blank
645c523858385176c33a7456bb84035de78552d22dMarc Blank        @Override
655c523858385176c33a7456bb84035de78552d22dMarc Blank        public void onPerformSync(android.accounts.Account account, Bundle extras,
665c523858385176c33a7456bb84035de78552d22dMarc Blank                String authority, ContentProviderClient provider, SyncResult syncResult) {
675c523858385176c33a7456bb84035de78552d22dMarc Blank            try {
685c523858385176c33a7456bb84035de78552d22dMarc Blank                PopImapSyncAdapterService.performSync(mContext, account, extras,
695c523858385176c33a7456bb84035de78552d22dMarc Blank                        authority, provider, syncResult);
705c523858385176c33a7456bb84035de78552d22dMarc Blank            } catch (OperationCanceledException e) {
715c523858385176c33a7456bb84035de78552d22dMarc Blank            }
725c523858385176c33a7456bb84035de78552d22dMarc Blank        }
735c523858385176c33a7456bb84035de78552d22dMarc Blank    }
745c523858385176c33a7456bb84035de78552d22dMarc Blank
755c523858385176c33a7456bb84035de78552d22dMarc Blank    @Override
765c523858385176c33a7456bb84035de78552d22dMarc Blank    public void onCreate() {
775c523858385176c33a7456bb84035de78552d22dMarc Blank        super.onCreate();
785c523858385176c33a7456bb84035de78552d22dMarc Blank        synchronized (sSyncAdapterLock) {
796bbbc0d57c6aa074af3967d596ff420622815f17Marc Blank            if (sSyncAdapter == null) {
806bbbc0d57c6aa074af3967d596ff420622815f17Marc Blank                sSyncAdapter = new SyncAdapterImpl(getApplicationContext());
816bbbc0d57c6aa074af3967d596ff420622815f17Marc Blank            }
825c523858385176c33a7456bb84035de78552d22dMarc Blank        }
835c523858385176c33a7456bb84035de78552d22dMarc Blank    }
845c523858385176c33a7456bb84035de78552d22dMarc Blank
855c523858385176c33a7456bb84035de78552d22dMarc Blank    @Override
865c523858385176c33a7456bb84035de78552d22dMarc Blank    public IBinder onBind(Intent intent) {
876bbbc0d57c6aa074af3967d596ff420622815f17Marc Blank        return sSyncAdapter.getSyncAdapterBinder();
885c523858385176c33a7456bb84035de78552d22dMarc Blank    }
895c523858385176c33a7456bb84035de78552d22dMarc Blank
905c523858385176c33a7456bb84035de78552d22dMarc Blank    /**
915c523858385176c33a7456bb84035de78552d22dMarc Blank     * @return whether or not this mailbox retrieves its data from the server (as opposed to just
925c523858385176c33a7456bb84035de78552d22dMarc Blank     *     a local mailbox that is never synced).
935c523858385176c33a7456bb84035de78552d22dMarc Blank     */
945c523858385176c33a7456bb84035de78552d22dMarc Blank    private static boolean loadsFromServer(Context context, Mailbox m, String protocol) {
955c523858385176c33a7456bb84035de78552d22dMarc Blank        String legacyImapProtocol = context.getString(R.string.protocol_legacy_imap);
9654347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank        String pop3Protocol = context.getString(R.string.protocol_pop3);
975c523858385176c33a7456bb84035de78552d22dMarc Blank        if (legacyImapProtocol.equals(protocol)) {
985c523858385176c33a7456bb84035de78552d22dMarc Blank            // TODO: actually use a sync flag when creating the mailboxes. Right now we use an
995c523858385176c33a7456bb84035de78552d22dMarc Blank            // approximation for IMAP.
1005c523858385176c33a7456bb84035de78552d22dMarc Blank            return m.mType != Mailbox.TYPE_DRAFTS
1015c523858385176c33a7456bb84035de78552d22dMarc Blank                    && m.mType != Mailbox.TYPE_OUTBOX
1025c523858385176c33a7456bb84035de78552d22dMarc Blank                    && m.mType != Mailbox.TYPE_SEARCH;
1035c523858385176c33a7456bb84035de78552d22dMarc Blank
10454347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank        } else if (pop3Protocol.equals(protocol)) {
1055c523858385176c33a7456bb84035de78552d22dMarc Blank            return Mailbox.TYPE_INBOX == m.mType;
1065c523858385176c33a7456bb84035de78552d22dMarc Blank        }
1075c523858385176c33a7456bb84035de78552d22dMarc Blank
1085c523858385176c33a7456bb84035de78552d22dMarc Blank        return false;
1095c523858385176c33a7456bb84035de78552d22dMarc Blank    }
1105c523858385176c33a7456bb84035de78552d22dMarc Blank
1115c523858385176c33a7456bb84035de78552d22dMarc Blank    private static void sync(Context context, long mailboxId, SyncResult syncResult,
1125c523858385176c33a7456bb84035de78552d22dMarc Blank            boolean uiRefresh) {
1135c523858385176c33a7456bb84035de78552d22dMarc Blank        TempDirectory.setTempDirectory(context);
1145c523858385176c33a7456bb84035de78552d22dMarc Blank        Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
1155c523858385176c33a7456bb84035de78552d22dMarc Blank        if (mailbox == null) return;
1165c523858385176c33a7456bb84035de78552d22dMarc Blank        Account account = Account.restoreAccountWithId(context, mailbox.mAccountKey);
1175c523858385176c33a7456bb84035de78552d22dMarc Blank        if (account == null) return;
1185c523858385176c33a7456bb84035de78552d22dMarc Blank        ContentResolver resolver = context.getContentResolver();
1195c523858385176c33a7456bb84035de78552d22dMarc Blank        String protocol = account.getProtocol(context);
1205c523858385176c33a7456bb84035de78552d22dMarc Blank        if ((mailbox.mType != Mailbox.TYPE_OUTBOX) &&
1215c523858385176c33a7456bb84035de78552d22dMarc Blank                !loadsFromServer(context, mailbox, protocol)) {
1225c523858385176c33a7456bb84035de78552d22dMarc Blank            // This is an update to a message in a non-syncing mailbox; delete this from the
1235c523858385176c33a7456bb84035de78552d22dMarc Blank            // updates table and return
1245c523858385176c33a7456bb84035de78552d22dMarc Blank            resolver.delete(Message.UPDATED_CONTENT_URI, Message.MAILBOX_KEY + "=?",
1255c523858385176c33a7456bb84035de78552d22dMarc Blank                    new String[] {Long.toString(mailbox.mId)});
1265c523858385176c33a7456bb84035de78552d22dMarc Blank            return;
1275c523858385176c33a7456bb84035de78552d22dMarc Blank        }
1285c523858385176c33a7456bb84035de78552d22dMarc Blank        Log.d(TAG, "Mailbox: " + mailbox.mDisplayName);
1295c523858385176c33a7456bb84035de78552d22dMarc Blank
1305c523858385176c33a7456bb84035de78552d22dMarc Blank        Uri mailboxUri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId);
1315c523858385176c33a7456bb84035de78552d22dMarc Blank        ContentValues values = new ContentValues();
1325c523858385176c33a7456bb84035de78552d22dMarc Blank        // Set mailbox sync state
1335c523858385176c33a7456bb84035de78552d22dMarc Blank        values.put(Mailbox.UI_SYNC_STATUS,
1345c523858385176c33a7456bb84035de78552d22dMarc Blank                uiRefresh ? EmailContent.SYNC_STATUS_USER : EmailContent.SYNC_STATUS_BACKGROUND);
1355c523858385176c33a7456bb84035de78552d22dMarc Blank        resolver.update(mailboxUri, values, null, null);
1365c523858385176c33a7456bb84035de78552d22dMarc Blank        try {
1375c523858385176c33a7456bb84035de78552d22dMarc Blank            try {
1385c523858385176c33a7456bb84035de78552d22dMarc Blank                String legacyImapProtocol = context.getString(R.string.protocol_legacy_imap);
1395c523858385176c33a7456bb84035de78552d22dMarc Blank                if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
1405c523858385176c33a7456bb84035de78552d22dMarc Blank                    EmailServiceStub.sendMailImpl(context, account.mId);
1415c523858385176c33a7456bb84035de78552d22dMarc Blank                } else if (protocol.equals(legacyImapProtocol)) {
1425c523858385176c33a7456bb84035de78552d22dMarc Blank                    ImapService.synchronizeMailboxSynchronous(context, account, mailbox);
1435c523858385176c33a7456bb84035de78552d22dMarc Blank                } else {
1445c523858385176c33a7456bb84035de78552d22dMarc Blank                    Pop3Service.synchronizeMailboxSynchronous(context, account, mailbox);
1455c523858385176c33a7456bb84035de78552d22dMarc Blank                }
1465c523858385176c33a7456bb84035de78552d22dMarc Blank            } catch (MessagingException e) {
1475c523858385176c33a7456bb84035de78552d22dMarc Blank                int cause = e.getExceptionType();
1485c523858385176c33a7456bb84035de78552d22dMarc Blank                switch(cause) {
1495c523858385176c33a7456bb84035de78552d22dMarc Blank                    case MessagingException.IOERROR:
1505c523858385176c33a7456bb84035de78552d22dMarc Blank                        syncResult.stats.numIoExceptions++;
1515c523858385176c33a7456bb84035de78552d22dMarc Blank                        break;
1525c523858385176c33a7456bb84035de78552d22dMarc Blank                    case MessagingException.AUTHENTICATION_FAILED:
1535c523858385176c33a7456bb84035de78552d22dMarc Blank                        syncResult.stats.numAuthExceptions++;
1545c523858385176c33a7456bb84035de78552d22dMarc Blank                        break;
1555c523858385176c33a7456bb84035de78552d22dMarc Blank                }
1565c523858385176c33a7456bb84035de78552d22dMarc Blank            }
1575c523858385176c33a7456bb84035de78552d22dMarc Blank        } finally {
1585c523858385176c33a7456bb84035de78552d22dMarc Blank            // Always clear our sync state
1595c523858385176c33a7456bb84035de78552d22dMarc Blank            values.put(Mailbox.UI_SYNC_STATUS, EmailContent.SYNC_STATUS_NONE);
1605c523858385176c33a7456bb84035de78552d22dMarc Blank            resolver.update(mailboxUri, values, null, null);
1615c523858385176c33a7456bb84035de78552d22dMarc Blank        }
1625c523858385176c33a7456bb84035de78552d22dMarc Blank    }
1635c523858385176c33a7456bb84035de78552d22dMarc Blank
1645c523858385176c33a7456bb84035de78552d22dMarc Blank    /**
1655c523858385176c33a7456bb84035de78552d22dMarc Blank     * Partial integration with system SyncManager; we initiate manual syncs upon request
1665c523858385176c33a7456bb84035de78552d22dMarc Blank     */
1675c523858385176c33a7456bb84035de78552d22dMarc Blank    private static void performSync(Context context, android.accounts.Account account,
1685c523858385176c33a7456bb84035de78552d22dMarc Blank            Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult)
1695c523858385176c33a7456bb84035de78552d22dMarc Blank                    throws OperationCanceledException {
1705c523858385176c33a7456bb84035de78552d22dMarc Blank        // Find an EmailProvider account with the Account's email address
1715c523858385176c33a7456bb84035de78552d22dMarc Blank        Cursor c = null;
1725c523858385176c33a7456bb84035de78552d22dMarc Blank        try {
1735c523858385176c33a7456bb84035de78552d22dMarc Blank            c = provider.query(com.android.emailcommon.provider.Account.CONTENT_URI,
1745c523858385176c33a7456bb84035de78552d22dMarc Blank                    Account.CONTENT_PROJECTION, AccountColumns.EMAIL_ADDRESS + "=?",
1755c523858385176c33a7456bb84035de78552d22dMarc Blank                    new String[] {account.name}, null);
1765c523858385176c33a7456bb84035de78552d22dMarc Blank            if (c != null && c.moveToNext()) {
1775c523858385176c33a7456bb84035de78552d22dMarc Blank                Account acct = new Account();
1785c523858385176c33a7456bb84035de78552d22dMarc Blank                acct.restore(c);
1795c523858385176c33a7456bb84035de78552d22dMarc Blank                if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD)) {
1805c523858385176c33a7456bb84035de78552d22dMarc Blank                    Log.d(TAG, "Upload sync request for " + acct.mDisplayName);
1815c523858385176c33a7456bb84035de78552d22dMarc Blank                    // See if any boxes have mail...
1825c523858385176c33a7456bb84035de78552d22dMarc Blank                    ArrayList<Long> mailboxesToUpdate;
1835c523858385176c33a7456bb84035de78552d22dMarc Blank                    Cursor updatesCursor = provider.query(Message.UPDATED_CONTENT_URI,
1845c523858385176c33a7456bb84035de78552d22dMarc Blank                            new String[] {Message.MAILBOX_KEY},
1855c523858385176c33a7456bb84035de78552d22dMarc Blank                            Message.ACCOUNT_KEY + "=?",
1865c523858385176c33a7456bb84035de78552d22dMarc Blank                            new String[] {Long.toString(acct.mId)},
1875c523858385176c33a7456bb84035de78552d22dMarc Blank                            null);
1885c523858385176c33a7456bb84035de78552d22dMarc Blank                    try {
1895c523858385176c33a7456bb84035de78552d22dMarc Blank                        if ((updatesCursor == null) || (updatesCursor.getCount() == 0)) return;
1905c523858385176c33a7456bb84035de78552d22dMarc Blank                        mailboxesToUpdate = new ArrayList<Long>();
1915c523858385176c33a7456bb84035de78552d22dMarc Blank                        while (updatesCursor.moveToNext()) {
1925c523858385176c33a7456bb84035de78552d22dMarc Blank                            Long mailboxId = updatesCursor.getLong(0);
1935c523858385176c33a7456bb84035de78552d22dMarc Blank                            if (!mailboxesToUpdate.contains(mailboxId)) {
1945c523858385176c33a7456bb84035de78552d22dMarc Blank                                mailboxesToUpdate.add(mailboxId);
1955c523858385176c33a7456bb84035de78552d22dMarc Blank                            }
1965c523858385176c33a7456bb84035de78552d22dMarc Blank                        }
1975c523858385176c33a7456bb84035de78552d22dMarc Blank                    } finally {
1985c523858385176c33a7456bb84035de78552d22dMarc Blank                        if (updatesCursor != null) {
1995c523858385176c33a7456bb84035de78552d22dMarc Blank                            updatesCursor.close();
2005c523858385176c33a7456bb84035de78552d22dMarc Blank                        }
2015c523858385176c33a7456bb84035de78552d22dMarc Blank                    }
2025c523858385176c33a7456bb84035de78552d22dMarc Blank                    for (long mailboxId: mailboxesToUpdate) {
2035c523858385176c33a7456bb84035de78552d22dMarc Blank                        sync(context, mailboxId, syncResult, false);
2045c523858385176c33a7456bb84035de78552d22dMarc Blank                    }
2055c523858385176c33a7456bb84035de78552d22dMarc Blank                } else {
2065c523858385176c33a7456bb84035de78552d22dMarc Blank                    Log.d(TAG, "Sync request for " + acct.mDisplayName);
2075c523858385176c33a7456bb84035de78552d22dMarc Blank                    Log.d(TAG, extras.toString());
2085c523858385176c33a7456bb84035de78552d22dMarc Blank                    long mailboxId = extras.getLong(EmailServiceStub.SYNC_EXTRA_MAILBOX_ID,
2095c523858385176c33a7456bb84035de78552d22dMarc Blank                            Mailbox.NO_MAILBOX);
2105c523858385176c33a7456bb84035de78552d22dMarc Blank                    boolean isInbox = false;
2115c523858385176c33a7456bb84035de78552d22dMarc Blank                    if (mailboxId == Mailbox.NO_MAILBOX) {
2125c523858385176c33a7456bb84035de78552d22dMarc Blank                        mailboxId = Mailbox.findMailboxOfType(context, acct.mId,
2135c523858385176c33a7456bb84035de78552d22dMarc Blank                                Mailbox.TYPE_INBOX);
2145c523858385176c33a7456bb84035de78552d22dMarc Blank                        if (mailboxId == Mailbox.NO_MAILBOX) {
2155c523858385176c33a7456bb84035de78552d22dMarc Blank                            // Update folders?
2165c523858385176c33a7456bb84035de78552d22dMarc Blank                            EmailServiceProxy service =
2175c523858385176c33a7456bb84035de78552d22dMarc Blank                                EmailServiceUtils.getServiceForAccount(context, null, acct.mId);
2185c523858385176c33a7456bb84035de78552d22dMarc Blank                            service.updateFolderList(acct.mId);
2195c523858385176c33a7456bb84035de78552d22dMarc Blank                        }
2205c523858385176c33a7456bb84035de78552d22dMarc Blank                        isInbox = true;
2215c523858385176c33a7456bb84035de78552d22dMarc Blank                    }
2225c523858385176c33a7456bb84035de78552d22dMarc Blank                    if (mailboxId == Mailbox.NO_MAILBOX) return;
2235c523858385176c33a7456bb84035de78552d22dMarc Blank                    boolean uiRefresh =
2245c523858385176c33a7456bb84035de78552d22dMarc Blank                            extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
2255c523858385176c33a7456bb84035de78552d22dMarc Blank                    sync(context, mailboxId, syncResult, uiRefresh);
2265c523858385176c33a7456bb84035de78552d22dMarc Blank
2275c523858385176c33a7456bb84035de78552d22dMarc Blank                    // Outbox is a special case here
2285c523858385176c33a7456bb84035de78552d22dMarc Blank                    Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
2295c523858385176c33a7456bb84035de78552d22dMarc Blank                    if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
2305c523858385176c33a7456bb84035de78552d22dMarc Blank                        return;
2315c523858385176c33a7456bb84035de78552d22dMarc Blank                    }
2325c523858385176c33a7456bb84035de78552d22dMarc Blank
2335c523858385176c33a7456bb84035de78552d22dMarc Blank                    // Convert from minutes to seconds
2345c523858385176c33a7456bb84035de78552d22dMarc Blank                    int syncFrequency = acct.mSyncInterval * 60;
2355c523858385176c33a7456bb84035de78552d22dMarc Blank                    // Values < 0 are for "never" or "push"; 0 is undefined
2365c523858385176c33a7456bb84035de78552d22dMarc Blank                    if (syncFrequency <= 0) return;
2375c523858385176c33a7456bb84035de78552d22dMarc Blank                    Bundle ex = new Bundle();
2385c523858385176c33a7456bb84035de78552d22dMarc Blank                    if (!isInbox) {
2395c523858385176c33a7456bb84035de78552d22dMarc Blank                        ex.putLong(EmailServiceStub.SYNC_EXTRA_MAILBOX_ID, mailboxId);
2405c523858385176c33a7456bb84035de78552d22dMarc Blank                    }
2415c523858385176c33a7456bb84035de78552d22dMarc Blank                    Log.d(TAG, "Setting periodic sync for " + acct.mDisplayName + ": " +
2425c523858385176c33a7456bb84035de78552d22dMarc Blank                            syncFrequency + " seconds");
2435c523858385176c33a7456bb84035de78552d22dMarc Blank                    ContentResolver.addPeriodicSync(account, authority, ex, syncFrequency);
2445c523858385176c33a7456bb84035de78552d22dMarc Blank                }
2455c523858385176c33a7456bb84035de78552d22dMarc Blank            }
2465c523858385176c33a7456bb84035de78552d22dMarc Blank        } catch (Exception e) {
2475c523858385176c33a7456bb84035de78552d22dMarc Blank            e.printStackTrace();
2485c523858385176c33a7456bb84035de78552d22dMarc Blank        } finally {
2495c523858385176c33a7456bb84035de78552d22dMarc Blank            if (c != null) {
2505c523858385176c33a7456bb84035de78552d22dMarc Blank                c.close();
2515c523858385176c33a7456bb84035de78552d22dMarc Blank            }
2525c523858385176c33a7456bb84035de78552d22dMarc Blank        }
2535c523858385176c33a7456bb84035de78552d22dMarc Blank    }
2545c523858385176c33a7456bb84035de78552d22dMarc Blank}