Fix Calendar and Contacts syncing for POP and IMAP accounts

b/11818312

Change-Id: I34b82040991506bf9099cc0df237454a8f97c764
This commit is contained in:
Martin Hibdon 2014-03-20 13:33:34 -07:00
parent 50c5add15b
commit 3f4a556d54
2 changed files with 32 additions and 1 deletions

View File

@ -21,15 +21,19 @@ import android.accounts.AccountManagerFuture;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.provider.CalendarContract;
import android.provider.ContactsContract;
import android.text.TextUtils;
import com.android.email.NotificationController;
import com.android.email.R;
import com.android.email.activity.ComposeActivityEmail;
import com.android.email.service.EmailServiceUtils;
import com.android.email.service.EmailServiceUtils.EmailServiceInfo;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.HostAuth;
@ -98,7 +102,7 @@ public class AccountReconciler {
*
* @param context The context in which to operate
*/
public static void reconcileAccounts(final Context context) {
public static synchronized void reconcileAccounts(final Context context) {
final List<android.accounts.Account> amAccounts = getAllAmAccounts(context);
final List<Account> providerAccounts = getAllEmailProviderAccounts(context);
reconcileAccountsInternal(context, providerAccounts, amAccounts, true);
@ -221,6 +225,22 @@ public class AccountReconciler {
LogUtils.w(Logging.LOG_TAG, e.toString());
}
}
} else {
// Fix up the Calendar and Contacts syncing. It used to be possible for IMAP and
// POP accounts to get calendar and contacts syncing enabled.
// See b/11818312
final String accountType = accountManagerAccount.type;
final String protocol = EmailServiceUtils.getProtocolFromAccountType(
context, accountType);
final EmailServiceInfo info = EmailServiceUtils.getServiceInfo(context, protocol);
if (!info.syncCalendar) {
ContentResolver.setIsSyncable(accountManagerAccount,
CalendarContract.AUTHORITY, 0);
}
if (!info.syncContacts) {
ContentResolver.setIsSyncable(accountManagerAccount,
ContactsContract.AUTHORITY, 0);
}
}
}

View File

@ -98,6 +98,7 @@ import com.android.emailcommon.service.EmailServiceStatus;
import com.android.emailcommon.service.IEmailService;
import com.android.emailcommon.service.SearchParams;
import com.android.emailcommon.utility.AttachmentUtilities;
import com.android.emailcommon.utility.EmailAsyncTask;
import com.android.emailcommon.utility.IntentUtilities;
import com.android.emailcommon.utility.Utility;
import com.android.ex.photo.provider.PhotoContract;
@ -367,6 +368,15 @@ public class EmailProvider extends ContentProvider {
private Handler mDelayedSyncHandler;
private final Set<SyncRequestMessage> mDelayedSyncRequests = new HashSet<SyncRequestMessage>();
private static void reconcileAccountsAsync(final Context context) {
EmailAsyncTask.runAsyncParallel(new Runnable() {
@Override
public void run() {
AccountReconciler.reconcileAccounts(context);
}
});
}
public static Uri uiUri(String type, long id) {
return Uri.parse(uiUriString(type, id));
}
@ -937,6 +947,7 @@ public class EmailProvider extends ContentProvider {
init(context);
// Do this last, so that EmailContent/EmailProvider are initialized
MailActivityEmail.setServicesEnabledAsync(context);
reconcileAccountsAsync(context);
// Update widgets
final Intent updateAllWidgetsIntent =