/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.webkit; import android.content.Context; import android.util.Config; import android.util.Log; import android.webkit.CookieManager.Cookie; import java.util.ArrayList; import java.util.Iterator; /** * The class CookieSyncManager is used to synchronize the browser cookies * between RAM and FLASH. To get the best performance, browser cookie is saved * in RAM. We use a separate thread to sync the cookies between RAM and FLASH on * a timer base. * <p> * To use the CookieSyncManager, the host application has to call the following * when the application starts. * <p> * CookieSyncManager.createInstance(context) * <p> * To set up for sync, the host application has to call * <p> * CookieSyncManager.getInstance().startSync() * <p> * in its Activity.onResume(), and call * <p> * CookieSyncManager.getInstance().stopSync() * <p> * in its Activity.onStop(). * <p> * To get instant sync instead of waiting for the timer to trigger, the host can * call * <p> * CookieSyncManager.getInstance().sync() */ public final class CookieSyncManager extends WebSyncManager { private static CookieSyncManager sRef; // time when last update happened private long mLastUpdate; private CookieSyncManager(Context context) { super(context, "CookieSyncManager"); } /** * Singleton access to a {@link CookieSyncManager}. An * IllegalStateException will be thrown if * {@link CookieSyncManager#createInstance(Context)} is not called before. * * @return CookieSyncManager */ public static synchronized CookieSyncManager getInstance() { if (sRef == null) { throw new IllegalStateException( "CookieSyncManager::createInstance() needs to be called " + "before CookieSyncManager::getInstance()"); } return sRef; } /** * Create a singleton CookieSyncManager within a context * @param context * @return CookieSyncManager */ public static synchronized CookieSyncManager createInstance( Context context) { if (sRef == null) { sRef = new CookieSyncManager(context); } return sRef; } /** * Package level api, called from CookieManager Get all the cookies which * matches a given base domain. * @param domain * @return A list of Cookie */ ArrayList<Cookie> getCookiesForDomain(String domain) { // null mDataBase implies that the host application doesn't support // persistent cookie. No sync needed. if (mDataBase == null) { return new ArrayList<Cookie>(); } return mDataBase.getCookiesForDomain(domain); } /** * Package level api, called from CookieManager Clear all cookies in the * database */ void clearAllCookies() { // null mDataBase implies that the host application doesn't support // persistent cookie. if (mDataBase == null) { return; } mDataBase.clearCookies(); } /** * Returns true if there are any saved cookies. */ boolean hasCookies() { // null mDataBase implies that the host application doesn't support // persistent cookie. if (mDataBase == null) { return false; } return mDataBase.hasCookies(); } /** * Package level api, called from CookieManager Clear all session cookies in * the database */ void clearSessionCookies() { // null mDataBase implies that the host application doesn't support // persistent cookie. if (mDataBase == null) { return; } mDataBase.clearSessionCookies(); } /** * Package level api, called from CookieManager Clear all expired cookies in * the database */ void clearExpiredCookies(long now) { // null mDataBase implies that the host application doesn't support // persistent cookie. if (mDataBase == null) { return; } mDataBase.clearExpiredCookies(now); } protected void syncFromRamToFlash() { if (Config.LOGV) { Log.v(LOGTAG, "CookieSyncManager::syncFromRamToFlash STARTS"); } if (!CookieManager.getInstance().acceptCookie()) { return; } ArrayList<Cookie> cookieList = CookieManager.getInstance() .getUpdatedCookiesSince(mLastUpdate); mLastUpdate = System.currentTimeMillis(); syncFromRamToFlash(cookieList); ArrayList<Cookie> lruList = CookieManager.getInstance().deleteLRUDomain(); syncFromRamToFlash(lruList); if (Config.LOGV) { Log.v(LOGTAG, "CookieSyncManager::syncFromRamToFlash DONE"); } } private void syncFromRamToFlash(ArrayList<Cookie> list) { Iterator<Cookie> iter = list.iterator(); while (iter.hasNext()) { Cookie cookie = iter.next(); if (cookie.mode != Cookie.MODE_NORMAL) { if (cookie.mode != Cookie.MODE_NEW) { mDataBase.deleteCookies(cookie.domain, cookie.path, cookie.name); } if (cookie.mode != Cookie.MODE_DELETED) { mDataBase.addCookie(cookie); CookieManager.getInstance().syncedACookie(cookie); } else { CookieManager.getInstance().deleteACookie(cookie); } } } } }