| /* | |
| * Copyright 2013 Google Inc. | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| package com.example.android.basicsyncadapter; | |
| import android.accounts.Account; | |
| import android.accounts.AccountManager; | |
| import android.annotation.TargetApi; | |
| import android.content.ContentResolver; | |
| import android.content.Context; | |
| import android.os.Build; | |
| import android.os.Bundle; | |
| import android.preference.PreferenceManager; | |
| import com.example.android.common.accounts.GenericAccountService; | |
| import com.example.android.basicsyncadapter.provider.FeedContract; | |
| /** | |
| * Static helper methods for working with the sync framework. | |
| */ | |
| public class SyncUtils { | |
| private static final long SYNC_FREQUENCY = 60 * 60; // 1 hour (in seconds) | |
| private static final String CONTENT_AUTHORITY = FeedContract.CONTENT_AUTHORITY; | |
| private static final String PREF_SETUP_COMPLETE = "setup_complete"; | |
| // Value below must match the account type specified in res/xml/syncadapter.xml | |
| public static final String ACCOUNT_TYPE = "com.example.android.basicsyncadapter.account"; | |
| /** | |
| * Create an entry for this application in the system account list, if it isn't already there. | |
| * | |
| * @param context Context | |
| */ | |
| @TargetApi(Build.VERSION_CODES.FROYO) | |
| public static void CreateSyncAccount(Context context) { | |
| boolean newAccount = false; | |
| boolean setupComplete = PreferenceManager | |
| .getDefaultSharedPreferences(context).getBoolean(PREF_SETUP_COMPLETE, false); | |
| // Create account, if it's missing. (Either first run, or user has deleted account.) | |
| Account account = GenericAccountService.GetAccount(ACCOUNT_TYPE); | |
| AccountManager accountManager = | |
| (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE); | |
| if (accountManager.addAccountExplicitly(account, null, null)) { | |
| // Inform the system that this account supports sync | |
| ContentResolver.setIsSyncable(account, CONTENT_AUTHORITY, 1); | |
| // Inform the system that this account is eligible for auto sync when the network is up | |
| ContentResolver.setSyncAutomatically(account, CONTENT_AUTHORITY, true); | |
| // Recommend a schedule for automatic synchronization. The system may modify this based | |
| // on other scheduled syncs and network utilization. | |
| ContentResolver.addPeriodicSync( | |
| account, CONTENT_AUTHORITY, new Bundle(),SYNC_FREQUENCY); | |
| newAccount = true; | |
| } | |
| // Schedule an initial sync if we detect problems with either our account or our local | |
| // data has been deleted. (Note that it's possible to clear app data WITHOUT affecting | |
| // the account list, so wee need to check both.) | |
| if (newAccount || !setupComplete) { | |
| TriggerRefresh(); | |
| PreferenceManager.getDefaultSharedPreferences(context).edit() | |
| .putBoolean(PREF_SETUP_COMPLETE, true).commit(); | |
| } | |
| } | |
| /** | |
| * Helper method to trigger an immediate sync ("refresh"). | |
| * | |
| * <p>This should only be used when we need to preempt the normal sync schedule. Typically, this | |
| * means the user has pressed the "refresh" button. | |
| * | |
| * Note that SYNC_EXTRAS_MANUAL will cause an immediate sync, without any optimization to | |
| * preserve battery life. If you know new data is available (perhaps via a GCM notification), | |
| * but the user is not actively waiting for that data, you should omit this flag; this will give | |
| * the OS additional freedom in scheduling your sync request. | |
| */ | |
| public static void TriggerRefresh() { | |
| Bundle b = new Bundle(); | |
| // Disable sync backoff and ignore sync preferences. In other words...perform sync NOW! | |
| b.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); | |
| b.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); | |
| ContentResolver.requestSync( | |
| GenericAccountService.GetAccount(ACCOUNT_TYPE), // Sync account | |
| FeedContract.CONTENT_AUTHORITY, // Content authority | |
| b); // Extras | |
| } | |
| } |