1*90c8c64dSAndroid Build Coastguard Worker /* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright 2013 Google Inc. 3*90c8c64dSAndroid Build Coastguard Worker * 4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*90c8c64dSAndroid Build Coastguard Worker * 8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*90c8c64dSAndroid Build Coastguard Worker * 10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License. 15*90c8c64dSAndroid Build Coastguard Worker */ 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.basicsyncadapter; 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Worker import android.accounts.Account; 20*90c8c64dSAndroid Build Coastguard Worker import android.accounts.AccountManager; 21*90c8c64dSAndroid Build Coastguard Worker import android.annotation.TargetApi; 22*90c8c64dSAndroid Build Coastguard Worker import android.content.ContentResolver; 23*90c8c64dSAndroid Build Coastguard Worker import android.content.Context; 24*90c8c64dSAndroid Build Coastguard Worker import android.os.Build; 25*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle; 26*90c8c64dSAndroid Build Coastguard Worker import android.preference.PreferenceManager; 27*90c8c64dSAndroid Build Coastguard Worker 28*90c8c64dSAndroid Build Coastguard Worker import com.example.android.common.accounts.GenericAccountService; 29*90c8c64dSAndroid Build Coastguard Worker import com.example.android.basicsyncadapter.provider.FeedContract; 30*90c8c64dSAndroid Build Coastguard Worker 31*90c8c64dSAndroid Build Coastguard Worker /** 32*90c8c64dSAndroid Build Coastguard Worker * Static helper methods for working with the sync framework. 33*90c8c64dSAndroid Build Coastguard Worker */ 34*90c8c64dSAndroid Build Coastguard Worker public class SyncUtils { 35*90c8c64dSAndroid Build Coastguard Worker private static final long SYNC_FREQUENCY = 60 * 60; // 1 hour (in seconds) 36*90c8c64dSAndroid Build Coastguard Worker private static final String CONTENT_AUTHORITY = FeedContract.CONTENT_AUTHORITY; 37*90c8c64dSAndroid Build Coastguard Worker private static final String PREF_SETUP_COMPLETE = "setup_complete"; 38*90c8c64dSAndroid Build Coastguard Worker // Value below must match the account type specified in res/xml/syncadapter.xml 39*90c8c64dSAndroid Build Coastguard Worker public static final String ACCOUNT_TYPE = "com.example.android.basicsyncadapter.account"; 40*90c8c64dSAndroid Build Coastguard Worker 41*90c8c64dSAndroid Build Coastguard Worker /** 42*90c8c64dSAndroid Build Coastguard Worker * Create an entry for this application in the system account list, if it isn't already there. 43*90c8c64dSAndroid Build Coastguard Worker * 44*90c8c64dSAndroid Build Coastguard Worker * @param context Context 45*90c8c64dSAndroid Build Coastguard Worker */ 46*90c8c64dSAndroid Build Coastguard Worker @TargetApi(Build.VERSION_CODES.FROYO) CreateSyncAccount(Context context)47*90c8c64dSAndroid Build Coastguard Worker public static void CreateSyncAccount(Context context) { 48*90c8c64dSAndroid Build Coastguard Worker boolean newAccount = false; 49*90c8c64dSAndroid Build Coastguard Worker boolean setupComplete = PreferenceManager 50*90c8c64dSAndroid Build Coastguard Worker .getDefaultSharedPreferences(context).getBoolean(PREF_SETUP_COMPLETE, false); 51*90c8c64dSAndroid Build Coastguard Worker 52*90c8c64dSAndroid Build Coastguard Worker // Create account, if it's missing. (Either first run, or user has deleted account.) 53*90c8c64dSAndroid Build Coastguard Worker Account account = GenericAccountService.GetAccount(ACCOUNT_TYPE); 54*90c8c64dSAndroid Build Coastguard Worker AccountManager accountManager = 55*90c8c64dSAndroid Build Coastguard Worker (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE); 56*90c8c64dSAndroid Build Coastguard Worker if (accountManager.addAccountExplicitly(account, null, null)) { 57*90c8c64dSAndroid Build Coastguard Worker // Inform the system that this account supports sync 58*90c8c64dSAndroid Build Coastguard Worker ContentResolver.setIsSyncable(account, CONTENT_AUTHORITY, 1); 59*90c8c64dSAndroid Build Coastguard Worker // Inform the system that this account is eligible for auto sync when the network is up 60*90c8c64dSAndroid Build Coastguard Worker ContentResolver.setSyncAutomatically(account, CONTENT_AUTHORITY, true); 61*90c8c64dSAndroid Build Coastguard Worker // Recommend a schedule for automatic synchronization. The system may modify this based 62*90c8c64dSAndroid Build Coastguard Worker // on other scheduled syncs and network utilization. 63*90c8c64dSAndroid Build Coastguard Worker ContentResolver.addPeriodicSync( 64*90c8c64dSAndroid Build Coastguard Worker account, CONTENT_AUTHORITY, new Bundle(),SYNC_FREQUENCY); 65*90c8c64dSAndroid Build Coastguard Worker newAccount = true; 66*90c8c64dSAndroid Build Coastguard Worker } 67*90c8c64dSAndroid Build Coastguard Worker 68*90c8c64dSAndroid Build Coastguard Worker // Schedule an initial sync if we detect problems with either our account or our local 69*90c8c64dSAndroid Build Coastguard Worker // data has been deleted. (Note that it's possible to clear app data WITHOUT affecting 70*90c8c64dSAndroid Build Coastguard Worker // the account list, so wee need to check both.) 71*90c8c64dSAndroid Build Coastguard Worker if (newAccount || !setupComplete) { 72*90c8c64dSAndroid Build Coastguard Worker TriggerRefresh(); 73*90c8c64dSAndroid Build Coastguard Worker PreferenceManager.getDefaultSharedPreferences(context).edit() 74*90c8c64dSAndroid Build Coastguard Worker .putBoolean(PREF_SETUP_COMPLETE, true).commit(); 75*90c8c64dSAndroid Build Coastguard Worker } 76*90c8c64dSAndroid Build Coastguard Worker } 77*90c8c64dSAndroid Build Coastguard Worker 78*90c8c64dSAndroid Build Coastguard Worker /** 79*90c8c64dSAndroid Build Coastguard Worker * Helper method to trigger an immediate sync ("refresh"). 80*90c8c64dSAndroid Build Coastguard Worker * 81*90c8c64dSAndroid Build Coastguard Worker * <p>This should only be used when we need to preempt the normal sync schedule. Typically, this 82*90c8c64dSAndroid Build Coastguard Worker * means the user has pressed the "refresh" button. 83*90c8c64dSAndroid Build Coastguard Worker * 84*90c8c64dSAndroid Build Coastguard Worker * Note that SYNC_EXTRAS_MANUAL will cause an immediate sync, without any optimization to 85*90c8c64dSAndroid Build Coastguard Worker * preserve battery life. If you know new data is available (perhaps via a GCM notification), 86*90c8c64dSAndroid Build Coastguard Worker * but the user is not actively waiting for that data, you should omit this flag; this will give 87*90c8c64dSAndroid Build Coastguard Worker * the OS additional freedom in scheduling your sync request. 88*90c8c64dSAndroid Build Coastguard Worker */ TriggerRefresh()89*90c8c64dSAndroid Build Coastguard Worker public static void TriggerRefresh() { 90*90c8c64dSAndroid Build Coastguard Worker Bundle b = new Bundle(); 91*90c8c64dSAndroid Build Coastguard Worker // Disable sync backoff and ignore sync preferences. In other words...perform sync NOW! 92*90c8c64dSAndroid Build Coastguard Worker b.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); 93*90c8c64dSAndroid Build Coastguard Worker b.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); 94*90c8c64dSAndroid Build Coastguard Worker ContentResolver.requestSync( 95*90c8c64dSAndroid Build Coastguard Worker GenericAccountService.GetAccount(ACCOUNT_TYPE), // Sync account 96*90c8c64dSAndroid Build Coastguard Worker FeedContract.CONTENT_AUTHORITY, // Content authority 97*90c8c64dSAndroid Build Coastguard Worker b); // Extras 98*90c8c64dSAndroid Build Coastguard Worker } 99*90c8c64dSAndroid Build Coastguard Worker } 100