Merge "Decouple construction of WebView, CookieSyncManager, WebViewDatabase" into klp-dev
diff --git a/core/java/android/webkit/CookieSyncManager.java b/core/java/android/webkit/CookieSyncManager.java
index 276bcae..13aa43f 100644
--- a/core/java/android/webkit/CookieSyncManager.java
+++ b/core/java/android/webkit/CookieSyncManager.java
@@ -59,8 +59,10 @@
 
     private static CookieSyncManager sRef;
 
-    private CookieSyncManager(Context context) {
-        super(context, "CookieSyncManager");
+    private static boolean sGetInstanceAllowed = false;
+
+    private CookieSyncManager() {
+        super("CookieSyncManager");
     }
 
     /**
@@ -71,7 +73,10 @@
      * @return CookieSyncManager
      */
     public static synchronized CookieSyncManager getInstance() {
-        checkInstanceIsCreated();
+        checkInstanceIsAllowed();
+        if (sRef == null) {
+            sRef = new CookieSyncManager();
+        }
         return sRef;
     }
 
@@ -80,16 +85,13 @@
      * @param context
      * @return CookieSyncManager
      */
-    public static synchronized CookieSyncManager createInstance(
-            Context context) {
+    public static synchronized CookieSyncManager createInstance(Context context) {
         if (context == null) {
             throw new IllegalArgumentException("Invalid context argument");
         }
 
-        if (sRef == null) {
-            sRef = new CookieSyncManager(context);
-        }
-        return sRef;
+        setGetInstanceIsAllowed();
+        return getInstance();
     }
 
     protected void syncFromRamToFlash() {
@@ -110,8 +112,15 @@
         }
     }
 
-    private static void checkInstanceIsCreated() {
-        if (sRef == null) {
+    static void setGetInstanceIsAllowed() {
+        sGetInstanceAllowed = true;
+    }
+
+    private static void checkInstanceIsAllowed() {
+        // Prior to Android KK, calling createInstance() or constructing a WebView is
+        // a hard pre-condition for calling getInstance(). We retain that contract to aid
+        // developers targeting a range of SDK levels.
+        if (!sGetInstanceAllowed) {
             throw new IllegalStateException(
                     "CookieSyncManager::createInstance() needs to be called "
                             + "before CookieSyncManager::getInstance()");
diff --git a/core/java/android/webkit/WebSyncManager.java b/core/java/android/webkit/WebSyncManager.java
index d3ec603..c600a7e 100644
--- a/core/java/android/webkit/WebSyncManager.java
+++ b/core/java/android/webkit/WebSyncManager.java
@@ -36,7 +36,7 @@
     private String mThreadName;
     // handler of the sync thread
     protected Handler mHandler;
-    // database for the persistent storage
+    // database for the persistent storage. Always null.
     protected WebViewDatabase mDataBase;
     // Ref count for calls to start/stop sync
     private int mStartSyncRefCount;
@@ -60,16 +60,15 @@
     }
 
     protected WebSyncManager(Context context, String name) {
+        this(name);
+    }
+
+    /** @hide */
+    WebSyncManager(String name) {
         mThreadName = name;
-        if (context != null) {
-            mDataBase = WebViewDatabase.getInstance(context);
-            mSyncThread = new Thread(this);
-            mSyncThread.setName(mThreadName);
-            mSyncThread.start();
-        } else {
-            throw new IllegalStateException(
-                    "WebSyncManager can't be created without context");
-        }
+        mSyncThread = new Thread(this);
+        mSyncThread.setName(mThreadName);
+        mSyncThread.start();
     }
 
     protected Object clone() throws CloneNotSupportedException {
@@ -82,7 +81,7 @@
         mHandler = new SyncHandler();
         onSyncInit();
         // lower the priority after onSyncInit() is done
-       Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
 
         Message msg = mHandler.obtainMessage(SYNC_MESSAGE);
         mHandler.sendMessageDelayed(msg, SYNC_LATER_INTERVAL);
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 90cc72e..2cbe0e2 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -506,8 +506,8 @@
 
         ensureProviderCreated();
         mProvider.init(javaScriptInterfaces, privateBrowsing);
-        // Post condition of creating a webview is the CookieSyncManager instance exists.
-        CookieSyncManager.createInstance(getContext());
+        // Post condition of creating a webview is the CookieSyncManager.getInstance() is allowed.
+        CookieSyncManager.setGetInstanceIsAllowed();
     }
 
     /**