make syncadapter set whether the account is syncable
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 0c114ba..3a067e9 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -27,6 +27,8 @@
     <uses-permission android:name="android.permission.USE_CREDENTIALS" />
     <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
     <uses-permission android:name="android.permission.READ_SYNC_STATS" />
+    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
+    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_READ" />
     <uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_WRITE" />
diff --git a/src/com/android/providers/calendar/CalendarSyncAdapter.java b/src/com/android/providers/calendar/CalendarSyncAdapter.java
index 06a7ea6..77d6549 100644
--- a/src/com/android/providers/calendar/CalendarSyncAdapter.java
+++ b/src/com/android/providers/calendar/CalendarSyncAdapter.java
@@ -572,6 +572,13 @@
         super.onSyncStarting(context, account, manualSync, result);
     }
 
+    public boolean getIsSyncable(Account account)
+            throws IOException, AuthenticatorException, OperationCanceledException {
+        Account[] accounts = AccountManager.get(getContext()).getAccountsByTypeAndFeatures(
+                "com.google.GAIA", new String[]{"legacy_hosted_or_google"}, null, null).getResult();
+        return accounts.length > 0 && accounts[0].equals(account) && super.getIsSyncable(account);
+    }
+
     private void deletedEntryToContentValues(Long syncLocalId, EventEntry event,
             ContentValues values) {
         // see #deletedCursorToEntry.  this deletion cannot be an exception to a recurrence (e.g.,
@@ -1138,7 +1145,7 @@
                     syncExtras.clear();
                     syncExtras.putBoolean("moveWindow", true);
                     syncExtras.putString("feed", feedUrl);
-                    mContentResolver.startSync(Calendar.CONTENT_URI, syncExtras);
+                    ContentResolver.requestSync(null /* account */, Calendar.AUTHORITY, syncExtras);
                 }
             }
             getServerDiffsForFeed(context, baseSyncData, tempProvider, feedUrl,
diff --git a/tests/src/com/android/providers/calendar/TestCalendarSyncAdapter.java b/tests/src/com/android/providers/calendar/TestCalendarSyncAdapter.java
index bcc1c73..01d969e 100644
--- a/tests/src/com/android/providers/calendar/TestCalendarSyncAdapter.java
+++ b/tests/src/com/android/providers/calendar/TestCalendarSyncAdapter.java
@@ -27,9 +27,12 @@
 import android.os.Bundle;
 import android.text.format.DateUtils;
 import android.accounts.Account;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
 
 import java.util.Calendar;
 import java.util.TimeZone;
+import java.io.IOException;
 
 
 public class TestCalendarSyncAdapter extends TempProviderSyncAdapter {
@@ -57,6 +60,11 @@
         return false;
     }
 
+    public boolean getIsSyncable(Account account) 
+            throws IOException, AuthenticatorException, OperationCanceledException {
+        return true;
+    }
+
     @Override
     public void getServerDiffs(SyncContext context, SyncData syncData,
             SyncableContentProvider tempProvider,