From 45107e0c328dc689effc62b7a5a5afc6f18c94ac Mon Sep 17 00:00:00 2001 From: Marc Blank Date: Fri, 10 Jul 2009 11:40:27 -0700 Subject: [PATCH] AbstractSyncableContentProvider must only call onAccountsChanged with GAIA accounts Currently, ASCP calls onAccountsChanged with an array of ALL accounts, but ContactsProvider and CalendarProvider assume these are all GAIA accounts. This can cause a looping crash in acore, so the code has been changed to only pass an array of GAIA accounts... --- .../content/AbstractSyncableContentProvider.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/core/java/android/content/AbstractSyncableContentProvider.java b/core/java/android/content/AbstractSyncableContentProvider.java index db73dd5112536..218f501ae92d2 100644 --- a/core/java/android/content/AbstractSyncableContentProvider.java +++ b/core/java/android/content/AbstractSyncableContentProvider.java @@ -165,6 +165,20 @@ public abstract class AbstractSyncableContentProvider extends SyncableContentPro // Some providers override onAccountsChanged(); give them a database to // work with. mDb = mOpenHelper.getWritableDatabase(); + // Only call onAccountsChanged on GAIA accounts; otherwise, the contacts and + // calendar providers will choke as they try to sync unknown accounts with + // AbstractGDataSyncAdapter, which will put acore into a crash loop + ArrayList gaiaAccounts = new ArrayList(); + for (Account acct: accounts) { + if (acct.mType.equals("com.google.GAIA")) { + gaiaAccounts.add(acct); + } + } + accounts = new Account[gaiaAccounts.size()]; + int i = 0; + for (Account acct: gaiaAccounts) { + accounts[i++] = acct; + } onAccountsChanged(accounts); TempProviderSyncAdapter syncAdapter = getTempProviderSyncAdapter(); if (syncAdapter != null) { @@ -175,7 +189,6 @@ public abstract class AbstractSyncableContentProvider extends SyncableContentPro return true; } - /** * Get a non-persistent instance of this content provider. * You must call {@link #close} on the returned