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}