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
6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private CookieSyncManager(Context context) {
6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        super(context, "CookieSyncManager");
7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Singleton access to a {@link CookieSyncManager}. An
7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * IllegalStateException will be thrown if
7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * {@link CookieSyncManager#createInstance(Context)} is not called before.
7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     *
7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @return CookieSyncManager
7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    public static synchronized CookieSyncManager getInstance() {
8082d98161362750ed280675b704a5ae467091cfbaSteve Block        checkInstanceIsCreated();
8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return sRef;
8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
8554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Create a singleton CookieSyncManager within a context
8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @param context
8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @return CookieSyncManager
8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    public static synchronized CookieSyncManager createInstance(
9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            Context context) {
9187af7314d4319a0ccaaf466a25e3fe4f416cc953Kristian Monsen        if (context == null) {
9287af7314d4319a0ccaaf466a25e3fe4f416cc953Kristian Monsen            throw new IllegalArgumentException("Invalid context argument");
9387af7314d4319a0ccaaf466a25e3fe4f416cc953Kristian Monsen        }
9487af7314d4319a0ccaaf466a25e3fe4f416cc953Kristian Monsen
95d89a30af1f37317a51088a207dda865a2f60c83aKristian Monsen        JniUtil.setContext(context);
9682d98161362750ed280675b704a5ae467091cfbaSteve Block        Context appContext = context.getApplicationContext();
9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (sRef == null) {
9882d98161362750ed280675b704a5ae467091cfbaSteve Block            sRef = new CookieSyncManager(appContext);
9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
10054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return sRef;
10154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
10254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
104adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn     * Package level api, called from CookieManager. Get all the cookies which
10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * matches a given base domain.
10654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @param domain
10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @return A list of Cookie
10854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    ArrayList<Cookie> getCookiesForDomain(String domain) {
11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // null mDataBase implies that the host application doesn't support
11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // persistent cookie. No sync needed.
11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (mDataBase == null) {
11354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return new ArrayList<Cookie>();
11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
11554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
11654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return mDataBase.getCookiesForDomain(domain);
11754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
11854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
11954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
12054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Package level api, called from CookieManager Clear all cookies in the
12154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * database
12254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
12354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    void clearAllCookies() {
12454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // null mDataBase implies that the host application doesn't support
12554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // persistent cookie.
12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (mDataBase == null) {
12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return;
12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
12954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
13054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mDataBase.clearCookies();
13154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
13254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
13354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
13454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Returns true if there are any saved cookies.
13554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
13654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    boolean hasCookies() {
13754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // null mDataBase implies that the host application doesn't support
13854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // persistent cookie.
13954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (mDataBase == null) {
14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return false;
14154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
14254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
14354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return mDataBase.hasCookies();
14454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
14554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
14654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
14754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Package level api, called from CookieManager Clear all session cookies in
14854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * the database
14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    void clearSessionCookies() {
15154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // null mDataBase implies that the host application doesn't support
15254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // persistent cookie.
15354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (mDataBase == null) {
15454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return;
15554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
15654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
15754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mDataBase.clearSessionCookies();
15854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
15954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
16054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
16154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Package level api, called from CookieManager Clear all expired cookies in
16254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * the database
16354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
16454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    void clearExpiredCookies(long now) {
16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // null mDataBase implies that the host application doesn't support
16654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // persistent cookie.
16754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (mDataBase == null) {
16854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return;
16954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
17054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
17154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mDataBase.clearExpiredCookies(now);
17254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
17354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
17454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    protected void syncFromRamToFlash() {
1752e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger        if (DebugFlags.COOKIE_SYNC_MANAGER) {
17654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            Log.v(LOGTAG, "CookieSyncManager::syncFromRamToFlash STARTS");
17754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
17854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
17999f39771ab15fc13d221ebfb3682741002c5f7b1Iain Merrick        CookieManager manager = CookieManager.getInstance();
18099f39771ab15fc13d221ebfb3682741002c5f7b1Iain Merrick
18199f39771ab15fc13d221ebfb3682741002c5f7b1Iain Merrick        if (!manager.acceptCookie()) {
18254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return;
18354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
18454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
1853e826c99b9cc8d38b6c2f19bd4160ee21b5ca47bKristian Monsen        if (JniUtil.useChromiumHttpStack()) {
1863e826c99b9cc8d38b6c2f19bd4160ee21b5ca47bKristian Monsen            manager.flushCookieStore();
1873e826c99b9cc8d38b6c2f19bd4160ee21b5ca47bKristian Monsen        } else {
1883e826c99b9cc8d38b6c2f19bd4160ee21b5ca47bKristian Monsen            ArrayList<Cookie> cookieList = manager.getUpdatedCookiesSince(mLastUpdate);
1893e826c99b9cc8d38b6c2f19bd4160ee21b5ca47bKristian Monsen            mLastUpdate = System.currentTimeMillis();
1903e826c99b9cc8d38b6c2f19bd4160ee21b5ca47bKristian Monsen            syncFromRamToFlash(cookieList);
1913e826c99b9cc8d38b6c2f19bd4160ee21b5ca47bKristian Monsen
1923e826c99b9cc8d38b6c2f19bd4160ee21b5ca47bKristian Monsen            ArrayList<Cookie> lruList = manager.deleteLRUDomain();
1933e826c99b9cc8d38b6c2f19bd4160ee21b5ca47bKristian Monsen            syncFromRamToFlash(lruList);
1943e826c99b9cc8d38b6c2f19bd4160ee21b5ca47bKristian Monsen        }
19554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
1962e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger        if (DebugFlags.COOKIE_SYNC_MANAGER) {
19754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            Log.v(LOGTAG, "CookieSyncManager::syncFromRamToFlash DONE");
19854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
19954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
20054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
20154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private void syncFromRamToFlash(ArrayList<Cookie> list) {
20254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Iterator<Cookie> iter = list.iterator();
20354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        while (iter.hasNext()) {
20454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            Cookie cookie = iter.next();
20554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (cookie.mode != Cookie.MODE_NORMAL) {
20654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (cookie.mode != Cookie.MODE_NEW) {
20754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    mDataBase.deleteCookies(cookie.domain, cookie.path,
20854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                            cookie.name);
20954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                }
21054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (cookie.mode != Cookie.MODE_DELETED) {
21154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    mDataBase.addCookie(cookie);
21254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    CookieManager.getInstance().syncedACookie(cookie);
21354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                } else {
21454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    CookieManager.getInstance().deleteACookie(cookie);
21554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                }
21654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
21754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
21854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
21982d98161362750ed280675b704a5ae467091cfbaSteve Block
22082d98161362750ed280675b704a5ae467091cfbaSteve Block    private static void checkInstanceIsCreated() {
22182d98161362750ed280675b704a5ae467091cfbaSteve Block        if (sRef == null) {
22282d98161362750ed280675b704a5ae467091cfbaSteve Block            throw new IllegalStateException(
22382d98161362750ed280675b704a5ae467091cfbaSteve Block                    "CookieSyncManager::createInstance() needs to be called "
22482d98161362750ed280675b704a5ae467091cfbaSteve Block                            + "before CookieSyncManager::getInstance()");
22582d98161362750ed280675b704a5ae467091cfbaSteve Block        }
22682d98161362750ed280675b704a5ae467091cfbaSteve Block    }
22754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
228