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 Projectimport android.util.Log; 2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/** 24adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * The CookieSyncManager is used to synchronize the browser cookie store 25adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * between RAM and permanent storage. To get the best performance, browser cookies are 26adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * saved in RAM. A separate thread saves the cookies between, driven by a timer. 2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p> 28adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 2954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * To use the CookieSyncManager, the host application has to call the following 30adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * when the application starts: 3154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p> 32adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 33adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">CookieSyncManager.createInstance(context)</pre><p> 34adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 35adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * To set up for sync, the host application has to call<p> 36adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">CookieSyncManager.getInstance().startSync()</pre><p> 37adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 38adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * in Activity.onResume(), and call 3954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p> 40adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 41adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint"> 4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * CookieSyncManager.getInstance().stopSync() 43adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * </pre><p> 44adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 45adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * in Activity.onPause().<p> 46adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * To get instant sync instead of waiting for the timer to trigger, the host can 4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * call 4954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p> 50adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">CookieSyncManager.getInstance().sync()</pre><p> 51adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 52adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * The sync interval is 5 minutes, so you will want to force syncs 53adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * manually anyway, for instance in {@link 54adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * WebViewClient#onPageFinished}. Note that even sync() happens 55adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * asynchronously, so don't do it just as your activity is shutting 56adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * down. 5754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 5854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpublic final class CookieSyncManager extends WebSyncManager { 5954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static CookieSyncManager sRef; 6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private CookieSyncManager(Context context) { 6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project super(context, "CookieSyncManager"); 6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 6754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Singleton access to a {@link CookieSyncManager}. An 6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * IllegalStateException will be thrown if 6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link CookieSyncManager#createInstance(Context)} is not called before. 7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return CookieSyncManager 7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static synchronized CookieSyncManager getInstance() { 7482d98161362750ed280675b704a5ae467091cfbaSteve Block checkInstanceIsCreated(); 7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return sRef; 7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Create a singleton CookieSyncManager within a context 8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param context 8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return CookieSyncManager 8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static synchronized CookieSyncManager createInstance( 8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Context context) { 8587af7314d4319a0ccaaf466a25e3fe4f416cc953Kristian Monsen if (context == null) { 8687af7314d4319a0ccaaf466a25e3fe4f416cc953Kristian Monsen throw new IllegalArgumentException("Invalid context argument"); 8787af7314d4319a0ccaaf466a25e3fe4f416cc953Kristian Monsen } 8887af7314d4319a0ccaaf466a25e3fe4f416cc953Kristian Monsen 8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (sRef == null) { 9073eeb7b5ed5f88750156b787c665f7d3769fc56aJonathan Dixon sRef = new CookieSyncManager(context); 9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return sRef; 9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project protected void syncFromRamToFlash() { 962e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.COOKIE_SYNC_MANAGER) { 9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Log.v(LOGTAG, "CookieSyncManager::syncFromRamToFlash STARTS"); 9854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 10099f39771ab15fc13d221ebfb3682741002c5f7b1Iain Merrick CookieManager manager = CookieManager.getInstance(); 10199f39771ab15fc13d221ebfb3682741002c5f7b1Iain Merrick 10299f39771ab15fc13d221ebfb3682741002c5f7b1Iain Merrick if (!manager.acceptCookie()) { 10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return; 10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1060acb1c32fa002a648c8090f622b0094f406d5411Steve Block manager.flushCookieStore(); 10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1082e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.COOKIE_SYNC_MANAGER) { 10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Log.v(LOGTAG, "CookieSyncManager::syncFromRamToFlash DONE"); 11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 11382d98161362750ed280675b704a5ae467091cfbaSteve Block private static void checkInstanceIsCreated() { 11482d98161362750ed280675b704a5ae467091cfbaSteve Block if (sRef == null) { 11582d98161362750ed280675b704a5ae467091cfbaSteve Block throw new IllegalStateException( 11682d98161362750ed280675b704a5ae467091cfbaSteve Block "CookieSyncManager::createInstance() needs to be called " 11782d98161362750ed280675b704a5ae467091cfbaSteve Block + "before CookieSyncManager::getInstance()"); 11882d98161362750ed280675b704a5ae467091cfbaSteve Block } 11982d98161362750ed280675b704a5ae467091cfbaSteve Block } 12054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 121