154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/* 254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * you may not use this file except in compliance with the License. 654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * You may obtain a copy of the License at 754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * See the License for the specific language governing permissions and 1454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * limitations under the License. 1554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 1654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpackage android.webkit; 1854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.content.Context; 2054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/** 23adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * The CookieSyncManager is used to synchronize the browser cookie store 24adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * between RAM and permanent storage. To get the best performance, browser cookies are 25adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * saved in RAM. A separate thread saves the cookies between, driven by a timer. 2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p> 27adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * To use the CookieSyncManager, the host application has to call the following 29adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * when the application starts: 3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p> 31adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 32adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">CookieSyncManager.createInstance(context)</pre><p> 33adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 34adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * To set up for sync, the host application has to call<p> 35adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">CookieSyncManager.getInstance().startSync()</pre><p> 36adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 37adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * in Activity.onResume(), and call 3854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p> 39adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 40adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint"> 4154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * CookieSyncManager.getInstance().stopSync() 42adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * </pre><p> 43adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 44adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * in Activity.onPause().<p> 45adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * To get instant sync instead of waiting for the timer to trigger, the host can 4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * call 4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p> 49adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">CookieSyncManager.getInstance().sync()</pre><p> 50adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 51adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * The sync interval is 5 minutes, so you will want to force syncs 52adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * manually anyway, for instance in {@link 53adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * WebViewClient#onPageFinished}. Note that even sync() happens 54adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * asynchronously, so don't do it just as your activity is shutting 55adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * down. 5624f7e61a3859c37deee97c3e1d19a0903a6b2b2cHector Dearman * 5724f7e61a3859c37deee97c3e1d19a0903a6b2b2cHector Dearman * @deprecated The WebView now automatically syncs cookies as necessary. 5824f7e61a3859c37deee97c3e1d19a0903a6b2b2cHector Dearman * You no longer need to create or use the CookieSyncManager. 5924f7e61a3859c37deee97c3e1d19a0903a6b2b2cHector Dearman * To manually force a sync you can use the CookieManager 6024f7e61a3859c37deee97c3e1d19a0903a6b2b2cHector Dearman * method {@link CookieManager#flush} which is a synchronous 6124f7e61a3859c37deee97c3e1d19a0903a6b2b2cHector Dearman * replacement for {@link #sync}. 6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 63a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman@Deprecated 6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpublic final class CookieSyncManager extends WebSyncManager { 6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static CookieSyncManager sRef; 67eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon private static boolean sGetInstanceAllowed = false; 6859375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) private static final Object sLock = new Object(); 69eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon 70eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon private CookieSyncManager() { 71a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman super(null, null); 7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Singleton access to a {@link CookieSyncManager}. An 7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * IllegalStateException will be thrown if 7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link CookieSyncManager#createInstance(Context)} is not called before. 78a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * 7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return CookieSyncManager 8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 8159375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) public static CookieSyncManager getInstance() { 8259375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) synchronized (sLock) { 8359375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) checkInstanceIsAllowed(); 8459375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) if (sRef == null) { 8559375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) sRef = new CookieSyncManager(); 8659375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) } 8759375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) return sRef; 88eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon } 8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Create a singleton CookieSyncManager within a context 9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param context 9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return CookieSyncManager 9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 9659375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) public static CookieSyncManager createInstance(Context context) { 9759375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) synchronized (sLock) { 9859375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) if (context == null) { 9959375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) throw new IllegalArgumentException("Invalid context argument"); 10059375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) } 10159375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) setGetInstanceIsAllowed(); 10259375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles) return getInstance(); 10387af7314d4319a0ccaaf466a25e3fe4f416cc953Kristian Monsen } 10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 106a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman /** 107a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * sync() forces sync manager to sync now 108a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * @deprecated Use {@link CookieManager#flush} instead. 109a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman */ 110a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman @Deprecated 111a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman public void sync() { 112a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman CookieManager.getInstance().flush(); 113a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman } 11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 115a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman /** 116a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * @deprecated Use {@link CookieManager#flush} instead. 117a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman */ 118a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman @Deprecated 119a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman protected void syncFromRamToFlash() { 120a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman CookieManager.getInstance().flush(); 121a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman } 12299f39771ab15fc13d221ebfb3682741002c5f7b1Iain Merrick 123a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman /** 124a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * resetSync() resets sync manager's timer. 125a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * @deprecated Calling resetSync is no longer necessary as the WebView automatically 126a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * syncs cookies. 127a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman */ 128a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman @Deprecated 129a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman public void resetSync() { 130a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman } 13154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 132a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman /** 133a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * startSync() requests sync manager to start sync. 134a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * @deprecated Calling startSync is no longer necessary as the WebView automatically 135a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * syncs cookies. 136a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman */ 137a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman @Deprecated 138a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman public void startSync() { 139a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman } 14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 141a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman /** 142a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * stopSync() requests sync manager to stop sync. remove any SYNC_MESSAGE in 143a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * the queue to break the sync loop 144a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * @deprecated Calling stopSync is no longer useful as the WebView 145a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman * automatically syncs cookies. 146a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman */ 147a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman @Deprecated 148a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman public void stopSync() { 14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 151eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon static void setGetInstanceIsAllowed() { 152eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon sGetInstanceAllowed = true; 153eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon } 154eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon 155eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon private static void checkInstanceIsAllowed() { 156eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon // Prior to Android KK, calling createInstance() or constructing a WebView is 157eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon // a hard pre-condition for calling getInstance(). We retain that contract to aid 158eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon // developers targeting a range of SDK levels. 159eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon if (!sGetInstanceAllowed) { 16082d98161362750ed280675b704a5ae467091cfbaSteve Block throw new IllegalStateException( 16182d98161362750ed280675b704a5ae467091cfbaSteve Block "CookieSyncManager::createInstance() needs to be called " 16282d98161362750ed280675b704a5ae467091cfbaSteve Block + "before CookieSyncManager::getInstance()"); 16382d98161362750ed280675b704a5ae467091cfbaSteve Block } 16482d98161362750ed280675b704a5ae467091cfbaSteve Block } 16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 166