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.app.Service;
20*90c8c64dSAndroid Build Coastguard Worker import android.content.Intent;
21*90c8c64dSAndroid Build Coastguard Worker import android.os.IBinder;
22*90c8c64dSAndroid Build Coastguard Worker import android.util.Log;
23*90c8c64dSAndroid Build Coastguard Worker 
24*90c8c64dSAndroid Build Coastguard Worker /** Service to handle sync requests.
25*90c8c64dSAndroid Build Coastguard Worker  *
26*90c8c64dSAndroid Build Coastguard Worker  * <p>This service is invoked in response to Intents with action android.content.SyncAdapter, and
27*90c8c64dSAndroid Build Coastguard Worker  * returns a Binder connection to SyncAdapter.
28*90c8c64dSAndroid Build Coastguard Worker  *
29*90c8c64dSAndroid Build Coastguard Worker  * <p>For performance, only one sync adapter will be initialized within this application's context.
30*90c8c64dSAndroid Build Coastguard Worker  *
31*90c8c64dSAndroid Build Coastguard Worker  * <p>Note: The SyncService itself is not notified when a new sync occurs. It's role is to
32*90c8c64dSAndroid Build Coastguard Worker  * manage the lifecycle of our {@link SyncAdapter} and provide a handle to said SyncAdapter to the
33*90c8c64dSAndroid Build Coastguard Worker  * OS on request.
34*90c8c64dSAndroid Build Coastguard Worker  */
35*90c8c64dSAndroid Build Coastguard Worker public class SyncService extends Service {
36*90c8c64dSAndroid Build Coastguard Worker     private static final String TAG = "SyncService";
37*90c8c64dSAndroid Build Coastguard Worker 
38*90c8c64dSAndroid Build Coastguard Worker     private static final Object sSyncAdapterLock = new Object();
39*90c8c64dSAndroid Build Coastguard Worker     private static SyncAdapter sSyncAdapter = null;
40*90c8c64dSAndroid Build Coastguard Worker 
41*90c8c64dSAndroid Build Coastguard Worker     /**
42*90c8c64dSAndroid Build Coastguard Worker      * Thread-safe constructor, creates static {@link SyncAdapter} instance.
43*90c8c64dSAndroid Build Coastguard Worker      */
44*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreate()45*90c8c64dSAndroid Build Coastguard Worker     public void onCreate() {
46*90c8c64dSAndroid Build Coastguard Worker         super.onCreate();
47*90c8c64dSAndroid Build Coastguard Worker         Log.i(TAG, "Service created");
48*90c8c64dSAndroid Build Coastguard Worker         synchronized (sSyncAdapterLock) {
49*90c8c64dSAndroid Build Coastguard Worker             if (sSyncAdapter == null) {
50*90c8c64dSAndroid Build Coastguard Worker                 sSyncAdapter = new SyncAdapter(getApplicationContext(), true);
51*90c8c64dSAndroid Build Coastguard Worker             }
52*90c8c64dSAndroid Build Coastguard Worker         }
53*90c8c64dSAndroid Build Coastguard Worker     }
54*90c8c64dSAndroid Build Coastguard Worker 
55*90c8c64dSAndroid Build Coastguard Worker     @Override
56*90c8c64dSAndroid Build Coastguard Worker     /**
57*90c8c64dSAndroid Build Coastguard Worker      * Logging-only destructor.
58*90c8c64dSAndroid Build Coastguard Worker      */
onDestroy()59*90c8c64dSAndroid Build Coastguard Worker     public void onDestroy() {
60*90c8c64dSAndroid Build Coastguard Worker         super.onDestroy();
61*90c8c64dSAndroid Build Coastguard Worker         Log.i(TAG, "Service destroyed");
62*90c8c64dSAndroid Build Coastguard Worker     }
63*90c8c64dSAndroid Build Coastguard Worker 
64*90c8c64dSAndroid Build Coastguard Worker     /**
65*90c8c64dSAndroid Build Coastguard Worker      * Return Binder handle for IPC communication with {@link SyncAdapter}.
66*90c8c64dSAndroid Build Coastguard Worker      *
67*90c8c64dSAndroid Build Coastguard Worker      * <p>New sync requests will be sent directly to the SyncAdapter using this channel.
68*90c8c64dSAndroid Build Coastguard Worker      *
69*90c8c64dSAndroid Build Coastguard Worker      * @param intent Calling intent
70*90c8c64dSAndroid Build Coastguard Worker      * @return Binder handle for {@link SyncAdapter}
71*90c8c64dSAndroid Build Coastguard Worker      */
72*90c8c64dSAndroid Build Coastguard Worker     @Override
onBind(Intent intent)73*90c8c64dSAndroid Build Coastguard Worker     public IBinder onBind(Intent intent) {
74*90c8c64dSAndroid Build Coastguard Worker         return sSyncAdapter.getSyncAdapterBinder();
75*90c8c64dSAndroid Build Coastguard Worker     }
76*90c8c64dSAndroid Build Coastguard Worker }
77