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