/*
* Zirco Browser for Android
*
* Copyright (C) 2010 - 2011 J. Devauchelle and contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 3 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
package org.zirco.model;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.zirco.ui.runnables.XmlHistoryBookmarksExporter;
import org.zirco.utils.ApplicationUtils;
import org.zirco.utils.DateUtils;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.Browser;
import android.util.Log;
/**
* Implementation of the database adapter.
*/
public class DbAdapter {
private static final String TAG = "DbAdapter";
private static final String DATABASE_NAME = "ZIRCO";
private static final int DATABASE_VERSION = 6;
/**
* Adblock white list table.
*/
public static final String ADBLOCK_ROWID = "_id";
public static final String ADBLOCK_URL = "url";
private static final String ADBLOCK_WHITELIST_DATABASE_TABLE = "ADBLOCK_WHITELIST";
private static final String ADBLOCK_WHITELIST_DATABASE_CREATE = "CREATE TABLE " + ADBLOCK_WHITELIST_DATABASE_TABLE + " (" +
ADBLOCK_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
ADBLOCK_URL + " TEXT NOT NULL);";
/**
* Mobile view url table.
*/
public static final String MOBILE_VIEW_URL_ROWID = "_id";
public static final String MOBILE_VIEW_URL_URL = "url";
private static final String MOBILE_VIEW_DATABASE_TABLE = "MOBILE_VIEW_URL";
private static final String MOBILE_VIEW_DATABASE_CREATE = "CREATE TABLE " + MOBILE_VIEW_DATABASE_TABLE + " (" +
MOBILE_VIEW_URL_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
MOBILE_VIEW_URL_URL + " TEXT NOT NULL);";
protected boolean mAdBlockListNeedPopulate = false;
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private final Context mContext;
/**
* Constructor.
* @param ctx The current context.
*/
public DbAdapter(Context ctx) {
this.mContext = ctx;
}
/**
* Open the database helper.
* @return The current database adapter.
*/
public DbAdapter open() {
mDbHelper = new DatabaseHelper(mContext, this);
mDb = mDbHelper.getWritableDatabase();
if (mAdBlockListNeedPopulate) {
populateDefaultWhiteList();
mAdBlockListNeedPopulate = false;
}
return this;
}
/**
* Close the database helper.
*/
public void close() {
mDbHelper.close();
}
public SQLiteDatabase getDatabase() {
return mDb;
}
/*******************************************************************************************************************************************************
* Adblock white list.
*/
/**
* Get the white list url given its id.
* @param rowId The id.
* @return The white list url.
*/
public String getWhiteListItemById(long rowId) {
Cursor cursor = mDb.query(true, ADBLOCK_WHITELIST_DATABASE_TABLE, new String[] {ADBLOCK_ROWID, ADBLOCK_URL},
ADBLOCK_ROWID + "=" + rowId, null, null, null, null, null);
if (cursor.moveToFirst()) {
String result;
result = cursor.getString(cursor.getColumnIndex(ADBLOCK_URL));
cursor.close();
return result;
} else {
cursor.close();
return null;
}
}
/**
* Get the list of url presents in white list.
* @return The list of url presents in white list.
*/
public List<String> getWhiteList() {
List<String> result = new ArrayList<String>();
Cursor cursor = getWhiteListCursor();
if (cursor.moveToFirst()) {
do {
result.add(cursor.getString(cursor.getColumnIndex(ADBLOCK_URL)));
} while (cursor.moveToNext());
}
cursor.close();
return result;
}
/**
* Get a cursor to the list of url presents in white list.
* @return A cursor to the list of url presents in white list.
*/
public Cursor getWhiteListCursor() {
return mDb.query(ADBLOCK_WHITELIST_DATABASE_TABLE, new String[] {ADBLOCK_ROWID, ADBLOCK_URL}, null, null, null, null, null);
}
/**
* Insert an item in the white list.
* @param url The url to insert.
*/
public void insertInWhiteList(String url) {
ContentValues initialValues = new ContentValues();
initialValues.put(ADBLOCK_URL, url);
mDb.insert(ADBLOCK_WHITELIST_DATABASE_TABLE, null, initialValues);
}
/**
* Delete an item in white list given its id.
* @param id The id to delete.
*/
public void deleteFromWhiteList(long id) {
mDb.execSQL("DELETE FROM " + ADBLOCK_WHITELIST_DATABASE_TABLE + " WHERE " + ADBLOCK_ROWID + " = " + id + ";");
}
/**
* Delete all records from the white list.
*/
public void clearWhiteList() {
mDb.execSQL("DELETE FROM " + ADBLOCK_WHITELIST_DATABASE_TABLE + ";");
}
/*******************************************************************************************************************************************************
* Mobile view list.
*/
/**
* Get an url from the mobile view list from its id.
* @param rowId The id.
* @return The url.
*/
public String getMobileViewUrlItemById(long rowId) {
Cursor cursor = mDb.query(true, MOBILE_VIEW_DATABASE_TABLE, new String[] {MOBILE_VIEW_URL_ROWID, MOBILE_VIEW_URL_URL},
MOBILE_VIEW_URL_ROWID + "=" + rowId, null, null, null, null, null);
if (cursor.moveToFirst()) {
String result;
result = cursor.getString(cursor.getColumnIndex(MOBILE_VIEW_URL_URL));
cursor.close();
return result;
} else {
cursor.close();
return null;
}
}
/**
* Get a list of all urls in mobile view list.
* @return A list of url.
*/
public List<String> getMobileViewUrlList() {
List<String> result = new ArrayList<String>();
Cursor cursor = getMobileViewUrlCursor();
if (cursor.moveToFirst()) {
do {
result.add(cursor.getString(cursor.getColumnIndex(MOBILE_VIEW_URL_URL)));
} while (cursor.moveToNext());
}
cursor.close();
return result;
}
/**
* Get a Cursor to the mobile view url list.
* @return A Cursor to the mobile view url list.
*/
public Cursor getMobileViewUrlCursor() {
return mDb.query(MOBILE_VIEW_DATABASE_TABLE, new String[] {MOBILE_VIEW_URL_ROWID, MOBILE_VIEW_URL_URL}, null, null, null, null, null);
}
/**
* Insert an url in the mobile view url list.
* @param url The new url.
*/
public void insertInMobileViewUrlList(String url) {
ContentValues initialValues = new ContentValues();
initialValues.put(MOBILE_VIEW_URL_URL, url);
mDb.insert(MOBILE_VIEW_DATABASE_TABLE, null, initialValues);
}
/**
* Delete an url from the mobile view url list.
* @param id The id of the url to delete.
*/
public void deleteFromMobileViewUrlList(long id) {
mDb.execSQL("DELETE FROM " + MOBILE_VIEW_DATABASE_TABLE + " WHERE " + MOBILE_VIEW_URL_ROWID + " = " + id + ";");
}
/**
* Clear the mobile view url list.
*/
public void clearMobileViewUrlList() {
mDb.execSQL("DELETE FROM " + MOBILE_VIEW_DATABASE_TABLE + ";");
}
/**
* Populate the white list with default values.
*/
private void populateDefaultWhiteList() {
insertInWhiteList("google.com/reader");
}
/**
* DatabaseHelper.
*/
private static class DatabaseHelper extends SQLiteOpenHelper {
private DbAdapter mParent;
/**
* Constructor.
* @param context The current context.
* @param parent The DbAdapter parent.
*/
public DatabaseHelper(Context context, DbAdapter parent) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
mParent = parent;
}
@Override
public void onCreate(SQLiteDatabase db) {
//db.execSQL(BOOKMARKS_DATABASE_CREATE);
//db.execSQL(HISTORY_DATABASE_CREATE);
db.execSQL(ADBLOCK_WHITELIST_DATABASE_CREATE);
db.execSQL(MOBILE_VIEW_DATABASE_CREATE);
mParent.mAdBlockListNeedPopulate = true;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d(TAG, "Upgrading database.");
switch (oldVersion) {
case 1: //db.execSQL("ALTER TABLE " + BOOKMARKS_DATABASE_TABLE + " ADD " + BOOKMARKS_THUMBNAIL + " BLOB;");
case 2: //db.execSQL("ALTER TABLE " + BOOKMARKS_DATABASE_TABLE + " ADD " + BOOKMARKS_COUNT + " INTEGER NOT NULL DEFAULT 0;");
case 3:
db.execSQL(ADBLOCK_WHITELIST_DATABASE_CREATE);
mParent.mAdBlockListNeedPopulate = true;
case 4: db.execSQL(MOBILE_VIEW_DATABASE_CREATE);
case 5:
// Export old bookmarks before dropping table.
exportOldBookmarks(db);
db.execSQL("DROP TABLE IF EXISTS BOOKMARKS;");
db.execSQL("DROP TABLE IF EXISTS HISTORY;");
default: break;
}
}
/**
* Export bookmarks from the old database. Transform the query result
* into a MatrixCursor following the stock bookmarks database, so it
* can be exported with the XmlHistoryBookmarksExporter without any
* change on it.
* @param db The database.
*/
private void exportOldBookmarks(SQLiteDatabase db) {
Log.i("DbAdapter", "Start export of old bookmarks.");
try {
if (ApplicationUtils.checkCardState(mParent.mContext, false)) {
Log.i("DbAdapter", "Export of old bookmarks: SDCard checked.");
MatrixCursor cursor = null;
Cursor c = db.query( "BOOKMARKS",
new String[] { "_id",
"title",
"url",
"creation_date",
"count" },
null,
null,
null,
null,
null);
if (c != null) {
if (c.moveToFirst()) {
cursor = new MatrixCursor(new String[] {
Browser.BookmarkColumns.TITLE,
Browser.BookmarkColumns.URL,
Browser.BookmarkColumns.VISITS,
Browser.BookmarkColumns.DATE,
Browser.BookmarkColumns.CREATED,
Browser.BookmarkColumns.BOOKMARK
});
int titleColumn = c.getColumnIndex("title");
int urlColumn = c.getColumnIndex("url");
int creationDateColumn = c.getColumnIndex("creation_date");
int countColumn = c.getColumnIndex("count");
while (!c.isAfterLast()) {
Date date = DateUtils.convertFromDatabase(mParent.mContext, c.getString(creationDateColumn));
Object[] data = new Object[6];
data[0] = c.getString(titleColumn);
data[1] = c.getString(urlColumn);
data[2] = c.getInt(countColumn);
data[3] = date.getTime();
data[4] = date.getTime();
data[5] = 1;
cursor.addRow(data);
c.moveToNext();
}
}
c.close();
}
if (cursor != null) {
Log.i("DbAdapter", "Export of old bookmarks: Writing file.");
new Thread(new XmlHistoryBookmarksExporter(null, "auto-export.xml", cursor, null)).start();
}
}
} catch (Exception e) {
Log.i("DbAdapter", "Export of old bookmarks failed: " + e.getMessage());
}
Log.i("DbAdapter", "End of export of old bookmarks.");
}
}
}