PopImapSyncAdapterService.java revision 1a7838eed7558a8f5caa23128518cae09d8a034f
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.app.Service;
205c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.AbstractThreadedSyncAdapter;
215c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.ContentProviderClient;
225c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.ContentResolver;
235c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.ContentUris;
245c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.ContentValues;
255c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.Context;
265c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.Intent;
275c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.content.SyncResult;
285c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.database.Cursor;
295c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.net.Uri;
305c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.os.Bundle;
315c523858385176c33a7456bb84035de78552d22dMarc Blankimport android.os.IBinder;
325c523858385176c33a7456bb84035de78552d22dMarc Blank
335c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.email.R;
345c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.TempDirectory;
355c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.mail.MessagingException;
365c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.provider.Account;
375c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.provider.EmailContent;
385c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.provider.EmailContent.AccountColumns;
395c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.provider.EmailContent.Message;
405c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.provider.Mailbox;
415c523858385176c33a7456bb84035de78552d22dMarc Blankimport com.android.emailcommon.service.EmailServiceProxy;
422075c97f608a853923980865b72147a5c8ef71f0Yu Ping Huimport com.android.emailcommon.service.EmailServiceStatus;
43560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedyimport com.android.mail.utils.LogUtils;
445c523858385176c33a7456bb84035de78552d22dMarc Blank
455c523858385176c33a7456bb84035de78552d22dMarc Blankimport java.util.ArrayList;
465c523858385176c33a7456bb84035de78552d22dMarc Blank
475c523858385176c33a7456bb84035de78552d22dMarc Blankpublic class PopImapSyncAdapterService extends Service {
48d1a87bc02d65dde9e635848531e09aadc79ff538Paul Westbrook    private static final String TAG = "PopImapSyncService";
491484c6663db7b194eea9341ec8ecab6b44985c7cYu Ping Hu    private SyncAdapterImpl mSyncAdapter = null;
505c523858385176c33a7456bb84035de78552d22dMarc Blank
515c523858385176c33a7456bb84035de78552d22dMarc Blank    public PopImapSyncAdapterService() {
525c523858385176c33a7456bb84035de78552d22dMarc Blank        super();
535c523858385176c33a7456bb84035de78552d22dMarc Blank    }
545c523858385176c33a7456bb84035de78552d22dMarc Blank
555c523858385176c33a7456bb84035de78552d22dMarc Blank    private static class SyncAdapterImpl extends AbstractThreadedSyncAdapter {
565c523858385176c33a7456bb84035de78552d22dMarc Blank        public SyncAdapterImpl(Context context) {
575c523858385176c33a7456bb84035de78552d22dMarc Blank            super(context, true /* autoInitialize */);
585c523858385176c33a7456bb84035de78552d22dMarc Blank        }
595c523858385176c33a7456bb84035de78552d22dMarc Blank
605c523858385176c33a7456bb84035de78552d22dMarc Blank        @Override
615c523858385176c33a7456bb84035de78552d22dMarc Blank        public void onPerformSync(android.accounts.Account account, Bundle extras,
625c523858385176c33a7456bb84035de78552d22dMarc Blank                String authority, ContentProviderClient provider, SyncResult syncResult) {
631b8e0fa23f6e9957f0b8753dd3f5b95d3f5d98eaScott Kennedy            PopImapSyncAdapterService.performSync(getContext(), account, extras, provider,
641b8e0fa23f6e9957f0b8753dd3f5b95d3f5d98eaScott Kennedy                    syncResult);
655c523858385176c33a7456bb84035de78552d22dMarc Blank        }
665c523858385176c33a7456bb84035de78552d22dMarc Blank    }
675c523858385176c33a7456bb84035de78552d22dMarc Blank
685c523858385176c33a7456bb84035de78552d22dMarc Blank    @Override
695c523858385176c33a7456bb84035de78552d22dMarc Blank    public void onCreate() {
705c523858385176c33a7456bb84035de78552d22dMarc Blank        super.onCreate();
711484c6663db7b194eea9341ec8ecab6b44985c7cYu Ping Hu        mSyncAdapter = new SyncAdapterImpl(getApplicationContext());
725c523858385176c33a7456bb84035de78552d22dMarc Blank    }
735c523858385176c33a7456bb84035de78552d22dMarc Blank
745c523858385176c33a7456bb84035de78552d22dMarc Blank    @Override
755c523858385176c33a7456bb84035de78552d22dMarc Blank    public IBinder onBind(Intent intent) {
761484c6663db7b194eea9341ec8ecab6b44985c7cYu Ping Hu        return mSyncAdapter.getSyncAdapterBinder();
775c523858385176c33a7456bb84035de78552d22dMarc Blank    }
785c523858385176c33a7456bb84035de78552d22dMarc Blank
795c523858385176c33a7456bb84035de78552d22dMarc Blank    /**
805c523858385176c33a7456bb84035de78552d22dMarc Blank     * @return whether or not this mailbox retrieves its data from the server (as opposed to just
815c523858385176c33a7456bb84035de78552d22dMarc Blank     *     a local mailbox that is never synced).
825c523858385176c33a7456bb84035de78552d22dMarc Blank     */
835c523858385176c33a7456bb84035de78552d22dMarc Blank    private static boolean loadsFromServer(Context context, Mailbox m, String protocol) {
845c523858385176c33a7456bb84035de78552d22dMarc Blank        String legacyImapProtocol = context.getString(R.string.protocol_legacy_imap);
8554347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank        String pop3Protocol = context.getString(R.string.protocol_pop3);
865c523858385176c33a7456bb84035de78552d22dMarc Blank        if (legacyImapProtocol.equals(protocol)) {
875c523858385176c33a7456bb84035de78552d22dMarc Blank            // TODO: actually use a sync flag when creating the mailboxes. Right now we use an
885c523858385176c33a7456bb84035de78552d22dMarc Blank            // approximation for IMAP.
895c523858385176c33a7456bb84035de78552d22dMarc Blank            return m.mType != Mailbox.TYPE_DRAFTS
905c523858385176c33a7456bb84035de78552d22dMarc Blank                    && m.mType != Mailbox.TYPE_OUTBOX
915c523858385176c33a7456bb84035de78552d22dMarc Blank                    && m.mType != Mailbox.TYPE_SEARCH;
925c523858385176c33a7456bb84035de78552d22dMarc Blank
9354347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank        } else if (pop3Protocol.equals(protocol)) {
945c523858385176c33a7456bb84035de78552d22dMarc Blank            return Mailbox.TYPE_INBOX == m.mType;
955c523858385176c33a7456bb84035de78552d22dMarc Blank        }
965c523858385176c33a7456bb84035de78552d22dMarc Blank
975c523858385176c33a7456bb84035de78552d22dMarc Blank        return false;
985c523858385176c33a7456bb84035de78552d22dMarc Blank    }
995c523858385176c33a7456bb84035de78552d22dMarc Blank
1002075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu    private static void sync(final Context context, final long mailboxId,
1012075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu            final Bundle extras, final SyncResult syncResult, final boolean uiRefresh,
1022075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu            final int deltaMessageCount) {
1035c523858385176c33a7456bb84035de78552d22dMarc Blank        TempDirectory.setTempDirectory(context);
1045c523858385176c33a7456bb84035de78552d22dMarc Blank        Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
1055c523858385176c33a7456bb84035de78552d22dMarc Blank        if (mailbox == null) return;
1065c523858385176c33a7456bb84035de78552d22dMarc Blank        Account account = Account.restoreAccountWithId(context, mailbox.mAccountKey);
1075c523858385176c33a7456bb84035de78552d22dMarc Blank        if (account == null) return;
1085c523858385176c33a7456bb84035de78552d22dMarc Blank        ContentResolver resolver = context.getContentResolver();
1095c523858385176c33a7456bb84035de78552d22dMarc Blank        String protocol = account.getProtocol(context);
1105c523858385176c33a7456bb84035de78552d22dMarc Blank        if ((mailbox.mType != Mailbox.TYPE_OUTBOX) &&
1115c523858385176c33a7456bb84035de78552d22dMarc Blank                !loadsFromServer(context, mailbox, protocol)) {
1125c523858385176c33a7456bb84035de78552d22dMarc Blank            // This is an update to a message in a non-syncing mailbox; delete this from the
1135c523858385176c33a7456bb84035de78552d22dMarc Blank            // updates table and return
1145c523858385176c33a7456bb84035de78552d22dMarc Blank            resolver.delete(Message.UPDATED_CONTENT_URI, Message.MAILBOX_KEY + "=?",
1155c523858385176c33a7456bb84035de78552d22dMarc Blank                    new String[] {Long.toString(mailbox.mId)});
1165c523858385176c33a7456bb84035de78552d22dMarc Blank            return;
1175c523858385176c33a7456bb84035de78552d22dMarc Blank        }
118560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy        LogUtils.d(TAG, "Mailbox: " + mailbox.mDisplayName);
1195c523858385176c33a7456bb84035de78552d22dMarc Blank
1205c523858385176c33a7456bb84035de78552d22dMarc Blank        Uri mailboxUri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId);
1215c523858385176c33a7456bb84035de78552d22dMarc Blank        ContentValues values = new ContentValues();
1225c523858385176c33a7456bb84035de78552d22dMarc Blank        // Set mailbox sync state
1235c523858385176c33a7456bb84035de78552d22dMarc Blank        values.put(Mailbox.UI_SYNC_STATUS,
1245c523858385176c33a7456bb84035de78552d22dMarc Blank                uiRefresh ? EmailContent.SYNC_STATUS_USER : EmailContent.SYNC_STATUS_BACKGROUND);
1255c523858385176c33a7456bb84035de78552d22dMarc Blank        resolver.update(mailboxUri, values, null, null);
1265c523858385176c33a7456bb84035de78552d22dMarc Blank        try {
1275c523858385176c33a7456bb84035de78552d22dMarc Blank            try {
1285c523858385176c33a7456bb84035de78552d22dMarc Blank                String legacyImapProtocol = context.getString(R.string.protocol_legacy_imap);
1295c523858385176c33a7456bb84035de78552d22dMarc Blank                if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
1305c523858385176c33a7456bb84035de78552d22dMarc Blank                    EmailServiceStub.sendMailImpl(context, account.mId);
1315c523858385176c33a7456bb84035de78552d22dMarc Blank                } else {
1322075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                    EmailServiceStatus.syncMailboxStatus(resolver, extras, mailboxId,
1332075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                            EmailServiceStatus.IN_PROGRESS, 0);
1342075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                    final int status;
1352075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                    if (protocol.equals(legacyImapProtocol)) {
1362075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                        status = ImapService.synchronizeMailboxSynchronous(context, account,
137c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon                                mailbox, deltaMessageCount != 0, uiRefresh);
1382075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                    } else {
1392075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                        status = Pop3Service.synchronizeMailboxSynchronous(context, account,
1402075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                                mailbox, deltaMessageCount);
1412075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                    }
1422075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                    EmailServiceStatus.syncMailboxStatus(resolver, extras, mailboxId, status, 0);
1435c523858385176c33a7456bb84035de78552d22dMarc Blank                }
1445c523858385176c33a7456bb84035de78552d22dMarc Blank            } catch (MessagingException e) {
1455c523858385176c33a7456bb84035de78552d22dMarc Blank                int cause = e.getExceptionType();
1462075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                EmailServiceStatus.syncMailboxStatus(resolver, extras, mailboxId, cause, 0);
1475c523858385176c33a7456bb84035de78552d22dMarc Blank                switch(cause) {
1485c523858385176c33a7456bb84035de78552d22dMarc Blank                    case MessagingException.IOERROR:
1495c523858385176c33a7456bb84035de78552d22dMarc Blank                        syncResult.stats.numIoExceptions++;
1505c523858385176c33a7456bb84035de78552d22dMarc Blank                        break;
1515c523858385176c33a7456bb84035de78552d22dMarc Blank                    case MessagingException.AUTHENTICATION_FAILED:
1525c523858385176c33a7456bb84035de78552d22dMarc Blank                        syncResult.stats.numAuthExceptions++;
1535c523858385176c33a7456bb84035de78552d22dMarc Blank                        break;
1545c523858385176c33a7456bb84035de78552d22dMarc Blank                }
1555c523858385176c33a7456bb84035de78552d22dMarc Blank            }
1565c523858385176c33a7456bb84035de78552d22dMarc Blank        } finally {
15717d5bbf768c27ac7782b155e2ab25bcd480f5dcfYu Ping Hu            // Always clear our sync state and update sync time.
1585c523858385176c33a7456bb84035de78552d22dMarc Blank            values.put(Mailbox.UI_SYNC_STATUS, EmailContent.SYNC_STATUS_NONE);
15917d5bbf768c27ac7782b155e2ab25bcd480f5dcfYu Ping Hu            values.put(Mailbox.SYNC_TIME, System.currentTimeMillis());
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,
1681b8e0fa23f6e9957f0b8753dd3f5b95d3f5d98eaScott Kennedy            Bundle extras, ContentProviderClient provider, SyncResult syncResult) {
1695c523858385176c33a7456bb84035de78552d22dMarc Blank        // Find an EmailProvider account with the Account's email address
1705c523858385176c33a7456bb84035de78552d22dMarc Blank        Cursor c = null;
1715c523858385176c33a7456bb84035de78552d22dMarc Blank        try {
1725c523858385176c33a7456bb84035de78552d22dMarc Blank            c = provider.query(com.android.emailcommon.provider.Account.CONTENT_URI,
1735c523858385176c33a7456bb84035de78552d22dMarc Blank                    Account.CONTENT_PROJECTION, AccountColumns.EMAIL_ADDRESS + "=?",
1745c523858385176c33a7456bb84035de78552d22dMarc Blank                    new String[] {account.name}, null);
1755c523858385176c33a7456bb84035de78552d22dMarc Blank            if (c != null && c.moveToNext()) {
1765c523858385176c33a7456bb84035de78552d22dMarc Blank                Account acct = new Account();
1775c523858385176c33a7456bb84035de78552d22dMarc Blank                acct.restore(c);
1785c523858385176c33a7456bb84035de78552d22dMarc Blank                if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD)) {
179560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy                    LogUtils.d(TAG, "Upload sync request for " + acct.mDisplayName);
1805c523858385176c33a7456bb84035de78552d22dMarc Blank                    // See if any boxes have mail...
1815c523858385176c33a7456bb84035de78552d22dMarc Blank                    ArrayList<Long> mailboxesToUpdate;
1825c523858385176c33a7456bb84035de78552d22dMarc Blank                    Cursor updatesCursor = provider.query(Message.UPDATED_CONTENT_URI,
1835c523858385176c33a7456bb84035de78552d22dMarc Blank                            new String[] {Message.MAILBOX_KEY},
1845c523858385176c33a7456bb84035de78552d22dMarc Blank                            Message.ACCOUNT_KEY + "=?",
1855c523858385176c33a7456bb84035de78552d22dMarc Blank                            new String[] {Long.toString(acct.mId)},
1865c523858385176c33a7456bb84035de78552d22dMarc Blank                            null);
1875c523858385176c33a7456bb84035de78552d22dMarc Blank                    try {
1885c523858385176c33a7456bb84035de78552d22dMarc Blank                        if ((updatesCursor == null) || (updatesCursor.getCount() == 0)) return;
1895c523858385176c33a7456bb84035de78552d22dMarc Blank                        mailboxesToUpdate = new ArrayList<Long>();
1905c523858385176c33a7456bb84035de78552d22dMarc Blank                        while (updatesCursor.moveToNext()) {
1915c523858385176c33a7456bb84035de78552d22dMarc Blank                            Long mailboxId = updatesCursor.getLong(0);
1925c523858385176c33a7456bb84035de78552d22dMarc Blank                            if (!mailboxesToUpdate.contains(mailboxId)) {
1935c523858385176c33a7456bb84035de78552d22dMarc Blank                                mailboxesToUpdate.add(mailboxId);
1945c523858385176c33a7456bb84035de78552d22dMarc Blank                            }
1955c523858385176c33a7456bb84035de78552d22dMarc Blank                        }
1965c523858385176c33a7456bb84035de78552d22dMarc Blank                    } finally {
1975c523858385176c33a7456bb84035de78552d22dMarc Blank                        if (updatesCursor != null) {
1985c523858385176c33a7456bb84035de78552d22dMarc Blank                            updatesCursor.close();
1995c523858385176c33a7456bb84035de78552d22dMarc Blank                        }
2005c523858385176c33a7456bb84035de78552d22dMarc Blank                    }
2015c523858385176c33a7456bb84035de78552d22dMarc Blank                    for (long mailboxId: mailboxesToUpdate) {
2022075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                        sync(context, mailboxId, extras, syncResult, false, 0);
2035c523858385176c33a7456bb84035de78552d22dMarc Blank                    }
2045c523858385176c33a7456bb84035de78552d22dMarc Blank                } else {
205560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy                    LogUtils.d(TAG, "Sync request for " + acct.mDisplayName);
206560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy                    LogUtils.d(TAG, extras.toString());
2079e7f5a2a33a31ff392d3116f6432b2f93ffe8e71Yu Ping Hu                    long mailboxId =
2089e7f5a2a33a31ff392d3116f6432b2f93ffe8e71Yu Ping Hu                            extras.getLong(Mailbox.SYNC_EXTRA_MAILBOX_ID, Mailbox.NO_MAILBOX);
2091a7838eed7558a8f5caa23128518cae09d8a034fMartin Hibdon
2101a7838eed7558a8f5caa23128518cae09d8a034fMartin Hibdon                    // We update our folder structure on every sync.
2111a7838eed7558a8f5caa23128518cae09d8a034fMartin Hibdon                    final EmailServiceProxy service =
2121a7838eed7558a8f5caa23128518cae09d8a034fMartin Hibdon                            EmailServiceUtils.getServiceForAccount(context, acct.mId);
2131a7838eed7558a8f5caa23128518cae09d8a034fMartin Hibdon                    service.updateFolderList(acct.mId);
2141a7838eed7558a8f5caa23128518cae09d8a034fMartin Hibdon                    mailboxId = Mailbox.findMailboxOfType(context, acct.mId,
2151a7838eed7558a8f5caa23128518cae09d8a034fMartin Hibdon                            Mailbox.TYPE_INBOX);
2161a7838eed7558a8f5caa23128518cae09d8a034fMartin Hibdon
2175c523858385176c33a7456bb84035de78552d22dMarc Blank                    if (mailboxId == Mailbox.NO_MAILBOX) return;
2185c523858385176c33a7456bb84035de78552d22dMarc Blank                    boolean uiRefresh =
2195c523858385176c33a7456bb84035de78552d22dMarc Blank                            extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
22017d5bbf768c27ac7782b155e2ab25bcd480f5dcfYu Ping Hu                    int deltaMessageCount =
2219e7f5a2a33a31ff392d3116f6432b2f93ffe8e71Yu Ping Hu                            extras.getInt(Mailbox.SYNC_EXTRA_DELTA_MESSAGE_COUNT, 0);
2222075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu                    sync(context, mailboxId, extras, syncResult, uiRefresh, deltaMessageCount);
2235c523858385176c33a7456bb84035de78552d22dMarc Blank                }
2245c523858385176c33a7456bb84035de78552d22dMarc Blank            }
2255c523858385176c33a7456bb84035de78552d22dMarc Blank        } catch (Exception e) {
2265c523858385176c33a7456bb84035de78552d22dMarc Blank            e.printStackTrace();
2275c523858385176c33a7456bb84035de78552d22dMarc Blank        } finally {
2285c523858385176c33a7456bb84035de78552d22dMarc Blank            if (c != null) {
2295c523858385176c33a7456bb84035de78552d22dMarc Blank                c.close();
2305c523858385176c33a7456bb84035de78552d22dMarc Blank            }
2315c523858385176c33a7456bb84035de78552d22dMarc Blank        }
2325c523858385176c33a7456bb84035de78552d22dMarc Blank    }
2332075c97f608a853923980865b72147a5c8ef71f0Yu Ping Hu}
234