| /* |
| * 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 |
| } |
| } |