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 Project
2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/**
23adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * The CookieSyncManager is used to synchronize the browser cookie store
24adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * between RAM and permanent storage. To get the best performance, browser cookies are
25adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * saved in RAM. A separate thread saves the cookies between, driven by a timer.
2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>
27adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn *
2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * To use the CookieSyncManager, the host application has to call the following
29adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * when the application starts:
3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>
31adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn *
32adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">CookieSyncManager.createInstance(context)</pre><p>
33adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn *
34adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * To set up for sync, the host application has to call<p>
35adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">CookieSyncManager.getInstance().startSync()</pre><p>
36adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn *
37adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * in Activity.onResume(), and call
3854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>
39adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn *
40adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">
4154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * CookieSyncManager.getInstance().stopSync()
42adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * </pre><p>
43adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn *
44adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * in Activity.onPause().<p>
45adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn *
4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * To get instant sync instead of waiting for the timer to trigger, the host can
4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * call
4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>
49adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * <pre class="prettyprint">CookieSyncManager.getInstance().sync()</pre><p>
50adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn *
51adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * The sync interval is 5 minutes, so you will want to force syncs
52adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * manually anyway, for instance in {@link
53adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * WebViewClient#onPageFinished}. Note that even sync() happens
54adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * asynchronously, so don't do it just as your activity is shutting
55adcd2ed8d24deddee528e96260d0ed673eeb261cMike Hearn * down.
5624f7e61a3859c37deee97c3e1d19a0903a6b2b2cHector Dearman *
5724f7e61a3859c37deee97c3e1d19a0903a6b2b2cHector Dearman * @deprecated The WebView now automatically syncs cookies as necessary.
5824f7e61a3859c37deee97c3e1d19a0903a6b2b2cHector Dearman *             You no longer need to create or use the CookieSyncManager.
5924f7e61a3859c37deee97c3e1d19a0903a6b2b2cHector Dearman *             To manually force a sync you can use the CookieManager
6024f7e61a3859c37deee97c3e1d19a0903a6b2b2cHector Dearman *             method {@link CookieManager#flush} which is a synchronous
6124f7e61a3859c37deee97c3e1d19a0903a6b2b2cHector Dearman *             replacement for {@link #sync}.
6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */
63a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman@Deprecated
6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpublic final class CookieSyncManager extends WebSyncManager {
6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    private static CookieSyncManager sRef;
67eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon    private static boolean sGetInstanceAllowed = false;
6859375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)    private static final Object sLock = new Object();
69eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon
70eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon    private CookieSyncManager() {
71a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman        super(null, null);
7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Singleton access to a {@link CookieSyncManager}. An
7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * IllegalStateException will be thrown if
7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * {@link CookieSyncManager#createInstance(Context)} is not called before.
78a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     *
7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @return CookieSyncManager
8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
8159375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)    public static CookieSyncManager getInstance() {
8259375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)        synchronized (sLock) {
8359375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)            checkInstanceIsAllowed();
8459375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)            if (sRef == null) {
8559375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)                sRef = new CookieSyncManager();
8659375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)            }
8759375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)            return sRef;
88eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon        }
8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /**
9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Create a singleton CookieSyncManager within a context
9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @param context
9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * @return CookieSyncManager
9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
9659375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)    public static CookieSyncManager createInstance(Context context) {
9759375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)        synchronized (sLock) {
9859375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)            if (context == null) {
9959375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)                throw new IllegalArgumentException("Invalid context argument");
10059375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)            }
10159375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)            setGetInstanceIsAllowed();
10259375a015a8a0cfdb5a330242241ab3c8df3774aTorne (Richard Coles)            return getInstance();
10387af7314d4319a0ccaaf466a25e3fe4f416cc953Kristian Monsen        }
10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
106a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    /**
107a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     * sync() forces sync manager to sync now
108a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     * @deprecated Use {@link CookieManager#flush} instead.
109a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     */
110a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    @Deprecated
111a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    public void sync() {
112a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman        CookieManager.getInstance().flush();
113a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    }
11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
115a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    /**
116a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     * @deprecated Use {@link CookieManager#flush} instead.
117a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     */
118a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    @Deprecated
119a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    protected void syncFromRamToFlash() {
120a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman        CookieManager.getInstance().flush();
121a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    }
12299f39771ab15fc13d221ebfb3682741002c5f7b1Iain Merrick
123a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    /**
124a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     * resetSync() resets sync manager's timer.
125a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     * @deprecated Calling resetSync is no longer necessary as the WebView automatically
126a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     *             syncs cookies.
127a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     */
128a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    @Deprecated
129a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    public void resetSync() {
130a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    }
13154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
132a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    /**
133a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     * startSync() requests sync manager to start sync.
134a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     * @deprecated Calling startSync is no longer necessary as the WebView automatically
135a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     *             syncs cookies.
136a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     */
137a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    @Deprecated
138a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    public void startSync() {
139a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    }
14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
141a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    /**
142a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     * stopSync() requests sync manager to stop sync. remove any SYNC_MESSAGE in
143a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     * the queue to break the sync loop
144a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     * @deprecated Calling stopSync is no longer useful as the WebView
145a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     *             automatically syncs cookies.
146a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman     */
147a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    @Deprecated
148a70d1d99de6cdadd68176cb849c02d56b8536021Hector Dearman    public void stopSync() {
14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
151eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon    static void setGetInstanceIsAllowed() {
152eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon        sGetInstanceAllowed = true;
153eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon    }
154eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon
155eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon    private static void checkInstanceIsAllowed() {
156eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon        // Prior to Android KK, calling createInstance() or constructing a WebView is
157eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon        // a hard pre-condition for calling getInstance(). We retain that contract to aid
158eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon        // developers targeting a range of SDK levels.
159eb9e801424005756f319d91493386b9a4f180921Jonathan Dixon        if (!sGetInstanceAllowed) {
16082d98161362750ed280675b704a5ae467091cfbaSteve Block            throw new IllegalStateException(
16182d98161362750ed280675b704a5ae467091cfbaSteve Block                    "CookieSyncManager::createInstance() needs to be called "
16282d98161362750ed280675b704a5ae467091cfbaSteve Block                            + "before CookieSyncManager::getInstance()");
16382d98161362750ed280675b704a5ae467091cfbaSteve Block        }
16482d98161362750ed280675b704a5ae467091cfbaSteve Block    }
16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
166