CookieSyncManager.java revision 82d98161362750ed280675b704a5ae467091cfba
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 Projectimport android.webkit.CookieManager.Cookie; 2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport java.util.ArrayList; 2454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport java.util.Iterator; 2554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/** 27adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * The CookieSyncManager is used to synchronize the browser cookie store 28adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * between RAM and permanent storage. To get the best performance, browser cookies are 29adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * saved in RAM. A separate thread saves the cookies between, driven by a timer. 3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p> 31adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 3254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * To use the CookieSyncManager, the host application has to call the following 33adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * when the application starts: 3454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p> 35adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 36adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">CookieSyncManager.createInstance(context)</pre><p> 37adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 38adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * To set up for sync, the host application has to call<p> 39adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">CookieSyncManager.getInstance().startSync()</pre><p> 40adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 41adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * in Activity.onResume(), and call 4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p> 43adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 44adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint"> 4554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * CookieSyncManager.getInstance().stopSync() 46adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * </pre><p> 47adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 48adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * in Activity.onPause().<p> 49adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * To get instant sync instead of waiting for the timer to trigger, the host can 5154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * call 5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p> 53adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">CookieSyncManager.getInstance().sync()</pre><p> 54adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * 55adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * The sync interval is 5 minutes, so you will want to force syncs 56adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * manually anyway, for instance in {@link 57adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * WebViewClient#onPageFinished}. Note that even sync() happens 58adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * asynchronously, so don't do it just as your activity is shutting 59adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * down. 6054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpublic final class CookieSyncManager extends WebSyncManager { 6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static CookieSyncManager sRef; 6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // time when last update happened 6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private long mLastUpdate; 6754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6882d98161362750ed280675b704a5ae467091cfbaSteve Block // Used by the Chromium HTTP stack. Everything else in this class is used only by the Android 6982d98161362750ed280675b704a5ae467091cfbaSteve Block // Java HTTP stack. 7082d98161362750ed280675b704a5ae467091cfbaSteve Block private static String sDatabaseDirectory; 7182d98161362750ed280675b704a5ae467091cfbaSteve Block private static String sCacheDirectory; 7282d98161362750ed280675b704a5ae467091cfbaSteve Block 7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private CookieSyncManager(Context context) { 7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project super(context, "CookieSyncManager"); 7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Singleton access to a {@link CookieSyncManager}. An 7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * IllegalStateException will be thrown if 8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link CookieSyncManager#createInstance(Context)} is not called before. 8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return CookieSyncManager 8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static synchronized CookieSyncManager getInstance() { 8582d98161362750ed280675b704a5ae467091cfbaSteve Block checkInstanceIsCreated(); 8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return sRef; 8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Create a singleton CookieSyncManager within a context 9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param context 9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return CookieSyncManager 9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public static synchronized CookieSyncManager createInstance( 9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Context context) { 9682d98161362750ed280675b704a5ae467091cfbaSteve Block Context appContext = context.getApplicationContext(); 9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (sRef == null) { 9882d98161362750ed280675b704a5ae467091cfbaSteve Block sRef = new CookieSyncManager(appContext); 9982d98161362750ed280675b704a5ae467091cfbaSteve Block sDatabaseDirectory = appContext.getDatabasePath("dummy").getParent(); 10082d98161362750ed280675b704a5ae467091cfbaSteve Block sCacheDirectory = appContext.getCacheDir().getAbsolutePath(); 10154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 10254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return sRef; 10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 106adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * Package level api, called from CookieManager. Get all the cookies which 10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * matches a given base domain. 10854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @param domain 10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return A list of Cookie 11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ArrayList<Cookie> getCookiesForDomain(String domain) { 11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // null mDataBase implies that the host application doesn't support 11354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // persistent cookie. No sync needed. 11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataBase == null) { 11554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return new ArrayList<Cookie>(); 11654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 11754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 11854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataBase.getCookiesForDomain(domain); 11954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 12054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 12154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 12254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Package level api, called from CookieManager Clear all cookies in the 12354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * database 12454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 12554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project void clearAllCookies() { 12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // null mDataBase implies that the host application doesn't support 12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // persistent cookie. 12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataBase == null) { 12954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return; 13054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 13154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 13254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataBase.clearCookies(); 13354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 13454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 13554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 13654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Returns true if there are any saved cookies. 13754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 13854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project boolean hasCookies() { 13954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // null mDataBase implies that the host application doesn't support 14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // persistent cookie. 14154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataBase == null) { 14254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return false; 14354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 14454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 14554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mDataBase.hasCookies(); 14654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 14754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 14854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Package level api, called from CookieManager Clear all session cookies in 15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the database 15154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 15254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project void clearSessionCookies() { 15354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // null mDataBase implies that the host application doesn't support 15454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // persistent cookie. 15554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataBase == null) { 15654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return; 15754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 15854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 15954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataBase.clearSessionCookies(); 16054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 16154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 16254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 16354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Package level api, called from CookieManager Clear all expired cookies in 16454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the database 16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 16654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project void clearExpiredCookies(long now) { 16754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // null mDataBase implies that the host application doesn't support 16854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // persistent cookie. 16954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mDataBase == null) { 17054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return; 17154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 17254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 17354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataBase.clearExpiredCookies(now); 17454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 17554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 17654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project protected void syncFromRamToFlash() { 1772e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.COOKIE_SYNC_MANAGER) { 17854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Log.v(LOGTAG, "CookieSyncManager::syncFromRamToFlash STARTS"); 17954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 18054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!CookieManager.getInstance().acceptCookie()) { 18254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return; 18354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 18454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ArrayList<Cookie> cookieList = CookieManager.getInstance() 18654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project .getUpdatedCookiesSince(mLastUpdate); 18754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLastUpdate = System.currentTimeMillis(); 18854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project syncFromRamToFlash(cookieList); 18954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 19054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ArrayList<Cookie> lruList = 19154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project CookieManager.getInstance().deleteLRUDomain(); 19254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project syncFromRamToFlash(lruList); 19354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1942e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.COOKIE_SYNC_MANAGER) { 19554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Log.v(LOGTAG, "CookieSyncManager::syncFromRamToFlash DONE"); 19654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 19754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 19854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 19954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private void syncFromRamToFlash(ArrayList<Cookie> list) { 20054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Iterator<Cookie> iter = list.iterator(); 20154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (iter.hasNext()) { 20254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Cookie cookie = iter.next(); 20354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (cookie.mode != Cookie.MODE_NORMAL) { 20454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (cookie.mode != Cookie.MODE_NEW) { 20554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataBase.deleteCookies(cookie.domain, cookie.path, 20654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project cookie.name); 20754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 20854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (cookie.mode != Cookie.MODE_DELETED) { 20954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mDataBase.addCookie(cookie); 21054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project CookieManager.getInstance().syncedACookie(cookie); 21154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 21254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project CookieManager.getInstance().deleteACookie(cookie); 21354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 21454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 21554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 21654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 21782d98161362750ed280675b704a5ae467091cfbaSteve Block 21882d98161362750ed280675b704a5ae467091cfbaSteve Block private static void checkInstanceIsCreated() { 21982d98161362750ed280675b704a5ae467091cfbaSteve Block if (sRef == null) { 22082d98161362750ed280675b704a5ae467091cfbaSteve Block throw new IllegalStateException( 22182d98161362750ed280675b704a5ae467091cfbaSteve Block "CookieSyncManager::createInstance() needs to be called " 22282d98161362750ed280675b704a5ae467091cfbaSteve Block + "before CookieSyncManager::getInstance()"); 22382d98161362750ed280675b704a5ae467091cfbaSteve Block } 22482d98161362750ed280675b704a5ae467091cfbaSteve Block } 22582d98161362750ed280675b704a5ae467091cfbaSteve Block 22682d98161362750ed280675b704a5ae467091cfbaSteve Block /** 22782d98161362750ed280675b704a5ae467091cfbaSteve Block * Called by JNI. Gets the application's database directory, excluding the trailing slash. 22882d98161362750ed280675b704a5ae467091cfbaSteve Block * @return String The application's database directory 22982d98161362750ed280675b704a5ae467091cfbaSteve Block */ 23082d98161362750ed280675b704a5ae467091cfbaSteve Block private static synchronized String getDatabaseDirectory() { 23182d98161362750ed280675b704a5ae467091cfbaSteve Block checkInstanceIsCreated(); 23282d98161362750ed280675b704a5ae467091cfbaSteve Block return sDatabaseDirectory; 23382d98161362750ed280675b704a5ae467091cfbaSteve Block } 23482d98161362750ed280675b704a5ae467091cfbaSteve Block 23582d98161362750ed280675b704a5ae467091cfbaSteve Block /** 23682d98161362750ed280675b704a5ae467091cfbaSteve Block * Called by JNI. Gets the application's cache directory, excluding the trailing slash. 23782d98161362750ed280675b704a5ae467091cfbaSteve Block * @return String The application's cache directory 23882d98161362750ed280675b704a5ae467091cfbaSteve Block */ 23982d98161362750ed280675b704a5ae467091cfbaSteve Block private static synchronized String getCacheDirectory() { 24082d98161362750ed280675b704a5ae467091cfbaSteve Block checkInstanceIsCreated(); 24182d98161362750ed280675b704a5ae467091cfbaSteve Block return sCacheDirectory; 24282d98161362750ed280675b704a5ae467091cfbaSteve Block } 24354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 244