19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.webkit;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map.Entry;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DatabaseUtils;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteStatement;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.webkit.CookieManager.Cookie;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.webkit.CacheManager.CacheResult;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WebViewDatabase {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String DATABASE_FILE = "webview.db";
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CACHE_DATABASE_FILE = "webviewCache.db";
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // log tag
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final String LOGTAG = "webviewdatabase";
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba    private static final int DATABASE_VERSION = 10;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // 2 -> 3 Modified Cache table to allow cache of redirects
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // 3 -> 4 Added Oma-Downloads table
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // 4 -> 5 Modified Cache table to support persistent contentLength
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // 5 -> 4 Removed Oma-Downoads table
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // 5 -> 6 Add INDEX for cache table
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // 6 -> 7 Change cache localPath from int to String
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // 7 -> 8 Move cache to its own db
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // 8 -> 9 Store both scheme and host when storing passwords
51b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba    // 9 -> 10 Update httpauth table UNIQUE
520b956e1353a691674cb22c899c5a444b92532b60Grace Kloba    private static final int CACHE_DATABASE_VERSION = 3;
53e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba    // 1 -> 2 Add expires String
540b956e1353a691674cb22c899c5a444b92532b60Grace Kloba    // 2 -> 3 Add content-disposition
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static WebViewDatabase mInstance = null;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static SQLiteDatabase mDatabase = null;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static SQLiteDatabase mCacheDatabase = null;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // synchronize locks
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mCookieLock = new Object();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mPasswordLock = new Object();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mFormLock = new Object();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mHttpAuthLock = new Object();
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String mTableNames[] = {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "cookies", "password", "formurl", "formdata", "httpauth"
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Table ids (they are index to mTableNames)
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TABLE_COOKIES_ID = 0;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TABLE_PASSWORD_ID = 1;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TABLE_FORMURL_ID = 2;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TABLE_FORMDATA_ID = 3;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TABLE_HTTPAUTH_ID = 4;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // column id strings for "_id" which can be used by any table
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String ID_COL = "_id";
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] ID_PROJECTION = new String[] {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "_id"
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // column id strings for "cookies" table
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String COOKIES_NAME_COL = "name";
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String COOKIES_VALUE_COL = "value";
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String COOKIES_DOMAIN_COL = "domain";
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String COOKIES_PATH_COL = "path";
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String COOKIES_EXPIRES_COL = "expires";
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String COOKIES_SECURE_COL = "secure";
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // column id strings for "cache" table
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CACHE_URL_COL = "url";
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CACHE_FILE_PATH_COL = "filepath";
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CACHE_LAST_MODIFY_COL = "lastmodify";
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CACHE_ETAG_COL = "etag";
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CACHE_EXPIRES_COL = "expires";
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
113e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba    private static final String CACHE_EXPIRES_STRING_COL = "expiresstring";
114e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CACHE_MIMETYPE_COL = "mimetype";
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CACHE_ENCODING_COL = "encoding";
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CACHE_HTTP_STATUS_COL = "httpstatus";
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CACHE_LOCATION_COL = "location";
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CACHE_CONTENTLENGTH_COL = "contentlength";
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1250b956e1353a691674cb22c899c5a444b92532b60Grace Kloba    private static final String CACHE_CONTENTDISPOSITION_COL = "contentdisposition";
1260b956e1353a691674cb22c899c5a444b92532b60Grace Kloba
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // column id strings for "password" table
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String PASSWORD_HOST_COL = "host";
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String PASSWORD_USERNAME_COL = "username";
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String PASSWORD_PASSWORD_COL = "password";
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // column id strings for "formurl" table
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String FORMURL_URL_COL = "url";
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // column id strings for "formdata" table
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String FORMDATA_URLID_COL = "urlid";
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String FORMDATA_NAME_COL = "name";
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String FORMDATA_VALUE_COL = "value";
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // column id strings for "httpauth" table
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String HTTPAUTH_HOST_COL = "host";
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String HTTPAUTH_REALM_COL = "realm";
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String HTTPAUTH_USERNAME_COL = "username";
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String HTTPAUTH_PASSWORD_COL = "password";
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // use InsertHelper to improve insert performance by 40%
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static DatabaseUtils.InsertHelper mCacheInserter;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int mCacheUrlColIndex;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int mCacheFilePathColIndex;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int mCacheLastModifyColIndex;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int mCacheETagColIndex;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int mCacheExpiresColIndex;
160e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba    private static int mCacheExpiresStringColIndex;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int mCacheMimeTypeColIndex;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int mCacheEncodingColIndex;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int mCacheHttpStatusColIndex;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int mCacheLocationColIndex;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int mCacheContentLengthColIndex;
1660b956e1353a691674cb22c899c5a444b92532b60Grace Kloba    private static int mCacheContentDispositionColIndex;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int mCacheTransactionRefcount;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WebViewDatabase() {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Singleton only, use getInstance()
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static synchronized WebViewDatabase getInstance(Context context) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInstance == null) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInstance = new WebViewDatabase();
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase = context.openOrCreateDatabase(DATABASE_FILE, 0, null);
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // mDatabase should not be null,
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the only case is RequestAPI test has problem to create db
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabase != null && mDatabase.getVersion() != DATABASE_VERSION) {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabase.beginTransaction();
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    upgradeDatabase();
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDatabase.setTransactionSuccessful();
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } finally {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDatabase.endTransaction();
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDatabase != null) {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // use per table Mutex lock, turn off database lock, this
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // improves performance as database's ReentrantLock is expansive
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabase.setLockingEnabled(false);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCacheDatabase = context.openOrCreateDatabase(CACHE_DATABASE_FILE,
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0, null);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // mCacheDatabase should not be null,
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the only case is RequestAPI test has problem to create db
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCacheDatabase != null
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && mCacheDatabase.getVersion() != CACHE_DATABASE_VERSION) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheDatabase.beginTransaction();
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    upgradeCacheDatabase();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bootstrapCacheDatabase();
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCacheDatabase.setTransactionSuccessful();
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } finally {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCacheDatabase.endTransaction();
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Erase the files from the file system in the
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // case that the database was updated and the
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // there were existing cache content
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                CacheManager.removeAllCacheFiles();
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCacheDatabase != null) {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // use InsertHelper for faster insertion
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheInserter = new DatabaseUtils.InsertHelper(mCacheDatabase,
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "cache");
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheUrlColIndex = mCacheInserter
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getColumnIndex(CACHE_URL_COL);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheFilePathColIndex = mCacheInserter
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getColumnIndex(CACHE_FILE_PATH_COL);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheLastModifyColIndex = mCacheInserter
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getColumnIndex(CACHE_LAST_MODIFY_COL);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheETagColIndex = mCacheInserter
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getColumnIndex(CACHE_ETAG_COL);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheExpiresColIndex = mCacheInserter
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getColumnIndex(CACHE_EXPIRES_COL);
232e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba                mCacheExpiresStringColIndex = mCacheInserter
233e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba                        .getColumnIndex(CACHE_EXPIRES_STRING_COL);
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheMimeTypeColIndex = mCacheInserter
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getColumnIndex(CACHE_MIMETYPE_COL);
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheEncodingColIndex = mCacheInserter
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getColumnIndex(CACHE_ENCODING_COL);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheHttpStatusColIndex = mCacheInserter
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getColumnIndex(CACHE_HTTP_STATUS_COL);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheLocationColIndex = mCacheInserter
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getColumnIndex(CACHE_LOCATION_COL);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheContentLengthColIndex = mCacheInserter
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getColumnIndex(CACHE_CONTENTLENGTH_COL);
2440b956e1353a691674cb22c899c5a444b92532b60Grace Kloba                mCacheContentDispositionColIndex = mCacheInserter
2450b956e1353a691674cb22c899c5a444b92532b60Grace Kloba                        .getColumnIndex(CACHE_CONTENTDISPOSITION_COL);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mInstance;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void upgradeDatabase() {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int oldVersion = mDatabase.getVersion();
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (oldVersion != 0) {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(LOGTAG, "Upgrading database from version "
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + oldVersion + " to "
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + DATABASE_VERSION + ", which will destroy old data");
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean justPasswords = 8 == oldVersion && 9 == DATABASE_VERSION;
260b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba        boolean justAuth = 9 == oldVersion && 10 == DATABASE_VERSION;
261b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba        if (justAuth) {
262b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba            mDatabase.execSQL("DROP TABLE IF EXISTS "
263b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba                    + mTableNames[TABLE_HTTPAUTH_ID]);
264b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba            mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_HTTPAUTH_ID]
265b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba                    + " (" + ID_COL + " INTEGER PRIMARY KEY, "
266b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba                    + HTTPAUTH_HOST_COL + " TEXT, " + HTTPAUTH_REALM_COL
267b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba                    + " TEXT, " + HTTPAUTH_USERNAME_COL + " TEXT, "
268b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba                    + HTTPAUTH_PASSWORD_COL + " TEXT," + " UNIQUE ("
269b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba                    + HTTPAUTH_HOST_COL + ", " + HTTPAUTH_REALM_COL
270b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba                    + ") ON CONFLICT REPLACE);");
271b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba            return;
272b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba        }
273b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!justPasswords) {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.execSQL("DROP TABLE IF EXISTS "
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mTableNames[TABLE_COOKIES_ID]);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.execSQL("DROP TABLE IF EXISTS cache");
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.execSQL("DROP TABLE IF EXISTS "
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mTableNames[TABLE_FORMURL_ID]);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.execSQL("DROP TABLE IF EXISTS "
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mTableNames[TABLE_FORMDATA_ID]);
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.execSQL("DROP TABLE IF EXISTS "
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mTableNames[TABLE_HTTPAUTH_ID]);
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("DROP TABLE IF EXISTS "
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + mTableNames[TABLE_PASSWORD_ID]);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.setVersion(DATABASE_VERSION);
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!justPasswords) {
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // cookies
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_COOKIES_ID]
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " (" + ID_COL + " INTEGER PRIMARY KEY, "
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + COOKIES_NAME_COL + " TEXT, " + COOKIES_VALUE_COL
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " TEXT, " + COOKIES_DOMAIN_COL + " TEXT, "
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + COOKIES_PATH_COL + " TEXT, " + COOKIES_EXPIRES_COL
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " INTEGER, " + COOKIES_SECURE_COL + " INTEGER" + ");");
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.execSQL("CREATE INDEX cookiesIndex ON "
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mTableNames[TABLE_COOKIES_ID] + " (path)");
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // formurl
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_FORMURL_ID]
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " (" + ID_COL + " INTEGER PRIMARY KEY, " + FORMURL_URL_COL
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " TEXT" + ");");
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // formdata
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_FORMDATA_ID]
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " (" + ID_COL + " INTEGER PRIMARY KEY, "
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + FORMDATA_URLID_COL + " INTEGER, " + FORMDATA_NAME_COL
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " TEXT, " + FORMDATA_VALUE_COL + " TEXT," + " UNIQUE ("
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + FORMDATA_URLID_COL + ", " + FORMDATA_NAME_COL + ", "
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + FORMDATA_VALUE_COL + ") ON CONFLICT IGNORE);");
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // httpauth
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_HTTPAUTH_ID]
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " (" + ID_COL + " INTEGER PRIMARY KEY, "
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + HTTPAUTH_HOST_COL + " TEXT, " + HTTPAUTH_REALM_COL
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " TEXT, " + HTTPAUTH_USERNAME_COL + " TEXT, "
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + HTTPAUTH_PASSWORD_COL + " TEXT," + " UNIQUE ("
320b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba                    + HTTPAUTH_HOST_COL + ", " + HTTPAUTH_REALM_COL
321b6e164c779881cf68768224bd67a8d949be0618aGrace Kloba                    + ") ON CONFLICT REPLACE);");
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // passwords
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_PASSWORD_ID]
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " (" + ID_COL + " INTEGER PRIMARY KEY, "
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + PASSWORD_HOST_COL + " TEXT, " + PASSWORD_USERNAME_COL
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " TEXT, " + PASSWORD_PASSWORD_COL + " TEXT," + " UNIQUE ("
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + PASSWORD_HOST_COL + ", " + PASSWORD_USERNAME_COL
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ") ON CONFLICT REPLACE);");
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void upgradeCacheDatabase() {
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int oldVersion = mCacheDatabase.getVersion();
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (oldVersion != 0) {
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(LOGTAG, "Upgrading cache database from version "
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + oldVersion + " to "
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + DATABASE_VERSION + ", which will destroy all old data");
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheDatabase.execSQL("DROP TABLE IF EXISTS cache");
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheDatabase.setVersion(CACHE_DATABASE_VERSION);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void bootstrapCacheDatabase() {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCacheDatabase != null) {
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCacheDatabase.execSQL("CREATE TABLE cache"
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " (" + ID_COL + " INTEGER PRIMARY KEY, " + CACHE_URL_COL
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " TEXT, " + CACHE_FILE_PATH_COL + " TEXT, "
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + CACHE_LAST_MODIFY_COL + " TEXT, " + CACHE_ETAG_COL
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " TEXT, " + CACHE_EXPIRES_COL + " INTEGER, "
350e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba                    + CACHE_EXPIRES_STRING_COL + " TEXT, "
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + CACHE_MIMETYPE_COL + " TEXT, " + CACHE_ENCODING_COL
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " TEXT," + CACHE_HTTP_STATUS_COL + " INTEGER, "
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + CACHE_LOCATION_COL + " TEXT, " + CACHE_CONTENTLENGTH_COL
3540b956e1353a691674cb22c899c5a444b92532b60Grace Kloba                    + " INTEGER, " + CACHE_CONTENTDISPOSITION_COL + " TEXT, "
3550b956e1353a691674cb22c899c5a444b92532b60Grace Kloba                    + " UNIQUE (" + CACHE_URL_COL + ") ON CONFLICT REPLACE);");
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCacheDatabase.execSQL("CREATE INDEX cacheUrlIndex ON cache ("
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + CACHE_URL_COL + ")");
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean hasEntries(int tableId) {
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDatabase == null) {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor cursor = mDatabase.query(mTableNames[tableId], ID_PROJECTION,
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, null, null, null, null);
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean ret = cursor.moveToFirst() == true;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cursor.close();
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ret;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // cookies functions
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get cookies in the format of CookieManager.Cookie inside an ArrayList for
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a given domain
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return ArrayList<Cookie> If nothing is found, return an empty list.
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<Cookie> getCookiesForDomain(String domain) {
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList<Cookie> list = new ArrayList<Cookie>();
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (domain == null || mDatabase == null) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return list;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mCookieLock) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final String[] columns = new String[] {
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ID_COL, COOKIES_DOMAIN_COL, COOKIES_PATH_COL,
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    COOKIES_NAME_COL, COOKIES_VALUE_COL, COOKIES_EXPIRES_COL,
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    COOKIES_SECURE_COL
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final String selection = "(" + COOKIES_DOMAIN_COL
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " GLOB '*' || ?)";
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cursor = mDatabase.query(mTableNames[TABLE_COOKIES_ID],
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    columns, selection, new String[] { domain }, null, null,
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    null);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cursor.moveToFirst()) {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int domainCol = cursor.getColumnIndex(COOKIES_DOMAIN_COL);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int pathCol = cursor.getColumnIndex(COOKIES_PATH_COL);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int nameCol = cursor.getColumnIndex(COOKIES_NAME_COL);
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int valueCol = cursor.getColumnIndex(COOKIES_VALUE_COL);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int expiresCol = cursor.getColumnIndex(COOKIES_EXPIRES_COL);
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int secureCol = cursor.getColumnIndex(COOKIES_SECURE_COL);
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                do {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Cookie cookie = new Cookie();
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cookie.domain = cursor.getString(domainCol);
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cookie.path = cursor.getString(pathCol);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cookie.name = cursor.getString(nameCol);
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cookie.value = cursor.getString(valueCol);
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (cursor.isNull(expiresCol)) {
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cookie.expires = -1;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cookie.expires = cursor.getLong(expiresCol);
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cookie.secure = cursor.getShort(secureCol) != 0;
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cookie.mode = Cookie.MODE_NORMAL;
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    list.add(cookie);
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } while (cursor.moveToNext());
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.close();
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return list;
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Delete cookies which matches (domain, path, name).
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param domain If it is null, nothing happens.
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param path If it is null, all the cookies match (domain) will be
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            deleted.
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name If it is null, all the cookies match (domain, path) will be
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            deleted.
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void deleteCookies(String domain, String path, String name) {
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (domain == null || mDatabase == null) {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mCookieLock) {
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final String where = "(" + COOKIES_DOMAIN_COL + " == ?) AND ("
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + COOKIES_PATH_COL + " == ?) AND (" + COOKIES_NAME_COL
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " == ?)";
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.delete(mTableNames[TABLE_COOKIES_ID], where,
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    new String[] { domain, path, name });
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add a cookie to the database
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cookie
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void addCookie(Cookie cookie) {
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cookie.domain == null || cookie.path == null || cookie.name == null
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || mDatabase == null) {
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mCookieLock) {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentValues cookieVal = new ContentValues();
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cookieVal.put(COOKIES_DOMAIN_COL, cookie.domain);
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cookieVal.put(COOKIES_PATH_COL, cookie.path);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cookieVal.put(COOKIES_NAME_COL, cookie.name);
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cookieVal.put(COOKIES_VALUE_COL, cookie.value);
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cookie.expires != -1) {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cookieVal.put(COOKIES_EXPIRES_COL, cookie.expires);
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cookieVal.put(COOKIES_SECURE_COL, cookie.secure);
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.insert(mTableNames[TABLE_COOKIES_ID], null, cookieVal);
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Whether there is any cookies in the database
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return TRUE if there is cookie.
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean hasCookies() {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mCookieLock) {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return hasEntries(TABLE_COOKIES_ID);
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Clear cookie database
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void clearCookies() {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDatabase == null) {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mCookieLock) {
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.delete(mTableNames[TABLE_COOKIES_ID], null, null);
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Clear session cookies, which means cookie doesn't have EXPIRES.
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void clearSessionCookies() {
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDatabase == null) {
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String sessionExpired = COOKIES_EXPIRES_COL + " ISNULL";
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mCookieLock) {
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.delete(mTableNames[TABLE_COOKIES_ID], sessionExpired,
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    null);
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Clear expired cookies
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param now Time for now
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void clearExpiredCookies(long now) {
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDatabase == null) {
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String expires = COOKIES_EXPIRES_COL + " <= ?";
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mCookieLock) {
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.delete(mTableNames[TABLE_COOKIES_ID], expires,
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    new String[] { Long.toString(now) });
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // cache functions, can only be called from WebCoreThread
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean startCacheTransaction() {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (++mCacheTransactionRefcount == 1) {
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCacheDatabase.beginTransaction();
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean endCacheTransaction() {
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (--mCacheTransactionRefcount == 0) {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheDatabase.setTransactionSuccessful();
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } finally {
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCacheDatabase.endTransaction();
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get a cache item.
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param url The url
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return CacheResult The CacheManager.CacheResult
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    CacheResult getCache(String url) {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (url == null || mCacheDatabase == null) {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor cursor = mCacheDatabase.rawQuery("SELECT filepath, lastmodify, etag, expires, "
5680b956e1353a691674cb22c899c5a444b92532b60Grace Kloba                    + "expiresstring, mimetype, encoding, httpstatus, location, contentlength, "
5690b956e1353a691674cb22c899c5a444b92532b60Grace Kloba                    + "contentdisposition FROM cache WHERE url = ?",
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new String[] { url });
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cursor.moveToFirst()) {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                CacheResult ret = new CacheResult();
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ret.localPath = cursor.getString(0);
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ret.lastModified = cursor.getString(1);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ret.etag = cursor.getString(2);
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ret.expires = cursor.getLong(3);
579e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba                ret.expiresString = cursor.getString(4);
580e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba                ret.mimeType = cursor.getString(5);
581e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba                ret.encoding = cursor.getString(6);
582e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba                ret.httpStatusCode = cursor.getInt(7);
583e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba                ret.location = cursor.getString(8);
584e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba                ret.contentLength = cursor.getLong(9);
5850b956e1353a691674cb22c899c5a444b92532b60Grace Kloba                ret.contentdisposition = cursor.getString(10);
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ret;
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cursor != null) cursor.close();
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove a cache item.
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param url The url
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void removeCache(String url) {
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (url == null || mCacheDatabase == null) {
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheDatabase.execSQL("DELETE FROM cache WHERE url = ?", new String[] { url });
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add or update a cache. CACHE_URL_COL is unique in the table.
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param url The url
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The CacheManager.CacheResult
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void addCache(String url, CacheResult c) {
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (url == null || mCacheDatabase == null) {
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheInserter.prepareForInsert();
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheInserter.bind(mCacheUrlColIndex, url);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheInserter.bind(mCacheFilePathColIndex, c.localPath);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheInserter.bind(mCacheLastModifyColIndex, c.lastModified);
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheInserter.bind(mCacheETagColIndex, c.etag);
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheInserter.bind(mCacheExpiresColIndex, c.expires);
624e64c5567de20d06ac7ed1f5a01f018991cd40a52Grace Kloba        mCacheInserter.bind(mCacheExpiresStringColIndex, c.expiresString);
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheInserter.bind(mCacheMimeTypeColIndex, c.mimeType);
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheInserter.bind(mCacheEncodingColIndex, c.encoding);
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheInserter.bind(mCacheHttpStatusColIndex, c.httpStatusCode);
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheInserter.bind(mCacheLocationColIndex, c.location);
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheInserter.bind(mCacheContentLengthColIndex, c.contentLength);
6300b956e1353a691674cb22c899c5a444b92532b60Grace Kloba        mCacheInserter.bind(mCacheContentDispositionColIndex,
6310b956e1353a691674cb22c899c5a444b92532b60Grace Kloba                c.contentdisposition);
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheInserter.execute();
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Clear cache database
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void clearCache() {
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCacheDatabase == null) {
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCacheDatabase.delete("cache", null, null);
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean hasCache() {
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCacheDatabase == null) {
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor cursor = mCacheDatabase.query("cache", ID_PROJECTION,
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, null, null, null, null);
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean ret = cursor.moveToFirst() == true;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cursor.close();
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ret;
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getCacheTotalSize() {
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long size = 0;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor cursor = mCacheDatabase.rawQuery(
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT SUM(contentlength) as sum FROM cache", null);
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cursor.moveToFirst()) {
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            size = cursor.getLong(0);
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cursor.close();
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return size;
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<String> trimCache(long amount) {
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList<String> pathList = new ArrayList<String>(100);
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Cursor cursor = mCacheDatabase.rawQuery(
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SELECT contentlength, filepath FROM cache ORDER BY expires ASC",
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null);
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cursor.moveToFirst()) {
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int batchSize = 100;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            StringBuilder pathStr = new StringBuilder(20 + 16 * batchSize);
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pathStr.append("DELETE FROM cache WHERE filepath IN (?");
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 1; i < batchSize; i++) {
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pathStr.append(", ?");
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pathStr.append(")");
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SQLiteStatement statement = mCacheDatabase.compileStatement(pathStr
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .toString());
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // as bindString() uses 1-based index, initialize index to 1
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int index = 1;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long length = cursor.getLong(0);
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (length == 0) {
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                amount -= length;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String filePath = cursor.getString(1);
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                statement.bindString(index, filePath);
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pathList.add(filePath);
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (index++ == batchSize) {
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    statement.execute();
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    statement.clearBindings();
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    index = 1;
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (cursor.moveToNext() && amount > 0);
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index > 1) {
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // there may be old bindings from the previous statement if
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // index is less than batchSize, which is Ok.
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                statement.execute();
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            statement.close();
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cursor.close();
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pathList;
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // password functions
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set password. Tuple (PASSWORD_HOST_COL, PASSWORD_USERNAME_COL) is unique.
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param schemePlusHost The scheme and host for the password
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param username The username for the password. If it is null, it means
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            password can't be saved.
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param password The password
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setUsernamePassword(String schemePlusHost, String username,
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String password) {
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (schemePlusHost == null || mDatabase == null) {
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mPasswordLock) {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ContentValues c = new ContentValues();
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c.put(PASSWORD_HOST_COL, schemePlusHost);
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c.put(PASSWORD_USERNAME_COL, username);
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c.put(PASSWORD_PASSWORD_COL, password);
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.insert(mTableNames[TABLE_PASSWORD_ID], PASSWORD_HOST_COL,
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    c);
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the username and password for a given host
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param schemePlusHost The scheme and host which passwords applies to
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return String[] if found, String[0] is username, which can be null and
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         String[1] is password. Return null if it can't find anything.
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String[] getUsernamePassword(String schemePlusHost) {
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (schemePlusHost == null || mDatabase == null) {
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] columns = new String[] {
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PASSWORD_USERNAME_COL, PASSWORD_PASSWORD_COL
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String selection = "(" + PASSWORD_HOST_COL + " == ?)";
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mPasswordLock) {
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] ret = null;
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cursor = mDatabase.query(mTableNames[TABLE_PASSWORD_ID],
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    columns, selection, new String[] { schemePlusHost }, null,
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    null, null);
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cursor.moveToFirst()) {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ret = new String[2];
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ret[0] = cursor.getString(
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cursor.getColumnIndex(PASSWORD_USERNAME_COL));
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ret[1] = cursor.getString(
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cursor.getColumnIndex(PASSWORD_PASSWORD_COL));
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.close();
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ret;
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Find out if there are any passwords saved.
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return TRUE if there is passwords saved
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasUsernamePassword() {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mPasswordLock) {
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return hasEntries(TABLE_PASSWORD_ID);
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Clear password database
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearUsernamePassword() {
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDatabase == null) {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mPasswordLock) {
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.delete(mTableNames[TABLE_PASSWORD_ID], null, null);
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // http authentication password functions
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set HTTP authentication password. Tuple (HTTPAUTH_HOST_COL,
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * HTTPAUTH_REALM_COL, HTTPAUTH_USERNAME_COL) is unique.
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param host The host for the password
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param realm The realm for the password
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param username The username for the password. If it is null, it means
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            password can't be saved.
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param password The password
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setHttpAuthUsernamePassword(String host, String realm, String username,
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String password) {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (host == null || realm == null || mDatabase == null) {
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mHttpAuthLock) {
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ContentValues c = new ContentValues();
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c.put(HTTPAUTH_HOST_COL, host);
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c.put(HTTPAUTH_REALM_COL, realm);
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c.put(HTTPAUTH_USERNAME_COL, username);
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c.put(HTTPAUTH_PASSWORD_COL, password);
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.insert(mTableNames[TABLE_HTTPAUTH_ID], HTTPAUTH_HOST_COL,
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    c);
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the HTTP authentication username and password for a given
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * host+realm pair
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param host The host the password applies to
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param realm The realm the password applies to
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return String[] if found, String[0] is username, which can be null and
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         String[1] is password. Return null if it can't find anything.
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String[] getHttpAuthUsernamePassword(String host, String realm) {
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (host == null || realm == null || mDatabase == null){
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String[] columns = new String[] {
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                HTTPAUTH_USERNAME_COL, HTTPAUTH_PASSWORD_COL
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String selection = "(" + HTTPAUTH_HOST_COL + " == ?) AND ("
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + HTTPAUTH_REALM_COL + " == ?)";
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mHttpAuthLock) {
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] ret = null;
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cursor = mDatabase.query(mTableNames[TABLE_HTTPAUTH_ID],
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    columns, selection, new String[] { host, realm }, null,
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    null, null);
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cursor.moveToFirst()) {
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ret = new String[2];
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ret[0] = cursor.getString(
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cursor.getColumnIndex(HTTPAUTH_USERNAME_COL));
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ret[1] = cursor.getString(
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cursor.getColumnIndex(HTTPAUTH_PASSWORD_COL));
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.close();
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ret;
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  Find out if there are any HTTP authentication passwords saved.
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return TRUE if there are passwords saved
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasHttpAuthUsernamePassword() {
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mHttpAuthLock) {
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return hasEntries(TABLE_HTTPAUTH_ID);
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Clear HTTP authentication password database
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearHttpAuthUsernamePassword() {
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDatabase == null) {
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mHttpAuthLock) {
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.delete(mTableNames[TABLE_HTTPAUTH_ID], null, null);
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // form data functions
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set form data for a site. Tuple (FORMDATA_URLID_COL, FORMDATA_NAME_COL,
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * FORMDATA_VALUE_COL) is unique
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param url The url of the site
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param formdata The form data in HashMap
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setFormData(String url, HashMap<String, String> formdata) {
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (url == null || formdata == null || mDatabase == null) {
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String selection = "(" + FORMURL_URL_COL + " == ?)";
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mFormLock) {
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long urlid = -1;
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cursor = mDatabase.query(mTableNames[TABLE_FORMURL_ID],
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ID_PROJECTION, selection, new String[] { url }, null, null,
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    null);
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cursor.moveToFirst()) {
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                urlid = cursor.getLong(cursor.getColumnIndex(ID_COL));
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ContentValues c = new ContentValues();
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                c.put(FORMURL_URL_COL, url);
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                urlid = mDatabase.insert(
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTableNames[TABLE_FORMURL_ID], null, c);
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.close();
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (urlid >= 0) {
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Set<Entry<String, String>> set = formdata.entrySet();
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Iterator<Entry<String, String>> iter = set.iterator();
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ContentValues map = new ContentValues();
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                map.put(FORMDATA_URLID_COL, urlid);
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (iter.hasNext()) {
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Entry<String, String> entry = iter.next();
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    map.put(FORMDATA_NAME_COL, entry.getKey());
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    map.put(FORMDATA_VALUE_COL, entry.getValue());
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDatabase.insert(mTableNames[TABLE_FORMDATA_ID], null, map);
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get all the values for a form entry with "name" in a given site
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param url The url of the site
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name The name of the form entry
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A list of values. Return empty list if nothing is found.
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<String> getFormData(String url, String name) {
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList<String> values = new ArrayList<String>();
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (url == null || name == null || mDatabase == null) {
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return values;
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String urlSelection = "(" + FORMURL_URL_COL + " == ?)";
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String dataSelection = "(" + FORMDATA_URLID_COL + " == ?) AND ("
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + FORMDATA_NAME_COL + " == ?)";
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mFormLock) {
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Cursor cursor = mDatabase.query(mTableNames[TABLE_FORMURL_ID],
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ID_PROJECTION, urlSelection, new String[] { url }, null,
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    null, null);
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cursor.moveToFirst()) {
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long urlid = cursor.getLong(cursor.getColumnIndex(ID_COL));
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Cursor dataCursor = mDatabase.query(
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTableNames[TABLE_FORMDATA_ID],
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        new String[] { ID_COL, FORMDATA_VALUE_COL },
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dataSelection,
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        new String[] { Long.toString(urlid), name }, null,
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        null, null);
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (dataCursor.moveToFirst()) {
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int valueCol =
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dataCursor.getColumnIndex(FORMDATA_VALUE_COL);
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    do {
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        values.add(dataCursor.getString(valueCol));
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } while (dataCursor.moveToNext());
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dataCursor.close();
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cursor.close();
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return values;
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Find out if there is form data saved.
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return TRUE if there is form data in the database
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasFormData() {
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mFormLock) {
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return hasEntries(TABLE_FORMURL_ID);
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Clear form database
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearFormData() {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDatabase == null) {
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mFormLock) {
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.delete(mTableNames[TABLE_FORMURL_ID], null, null);
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabase.delete(mTableNames[TABLE_FORMDATA_ID], null, null);
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1001