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