diff options
Diffstat (limited to 'src/com/android/browser/provider/BrowserProvider2.java')
-rw-r--r-- | src/com/android/browser/provider/BrowserProvider2.java | 145 |
1 files changed, 95 insertions, 50 deletions
diff --git a/src/com/android/browser/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java index 8137d55..cdda1e4 100644 --- a/src/com/android/browser/provider/BrowserProvider2.java +++ b/src/com/android/browser/provider/BrowserProvider2.java @@ -63,13 +63,17 @@ public class BrowserProvider2 extends SQLiteContentProvider { static final String TABLE_SEARCHES = "searches"; static final String TABLE_SYNC_STATE = "syncstate"; static final String TABLE_SETTINGS = "settings"; - static final String VIEW_COMBINED = "combined"; static final String TABLE_BOOKMARKS_JOIN_IMAGES = "bookmarks LEFT OUTER JOIN images " + "ON bookmarks.url = images." + Images.URL; static final String TABLE_HISTORY_JOIN_IMAGES = "history LEFT OUTER JOIN images " + "ON history.url = images." + Images.URL; + static final String FORMAT_COMBINED_JOIN_SUBQUERY_JOIN_IMAGES = + "history LEFT OUTER JOIN (%s) bookmarks " + + "ON history.url = bookmarks.url LEFT OUTER JOIN images " + + "ON history.url = images.url_key"; + static final String DEFAULT_SORT_HISTORY = History.DATE_LAST_VISITED + " DESC"; static final String DEFAULT_SORT_SEARCHES = Searches.DATE + " DESC"; @@ -115,7 +119,8 @@ public class BrowserProvider2 extends SQLiteContentProvider { static final HashMap<String, String> HISTORY_PROJECTION_MAP = new HashMap<String, String>(); static final HashMap<String, String> SYNC_STATE_PROJECTION_MAP = new HashMap<String, String>(); static final HashMap<String, String> IMAGES_PROJECTION_MAP = new HashMap<String, String>(); - static final HashMap<String, String> COMBINED_PROJECTION_MAP = new HashMap<String, String>(); + static final HashMap<String, String> COMBINED_HISTORY_PROJECTION_MAP = new HashMap<String, String>(); + static final HashMap<String, String> COMBINED_BOOKMARK_PROJECTION_MAP = new HashMap<String, String>(); static final HashMap<String, String> SEARCHES_PROJECTION_MAP = new HashMap<String, String>(); static final HashMap<String, String> SETTINGS_PROJECTION_MAP = new HashMap<String, String>(); @@ -213,18 +218,34 @@ public class BrowserProvider2 extends SQLiteContentProvider { map.put(Images.TOUCH_ICON, Images.TOUCH_ICON); // Combined history half - map = COMBINED_PROJECTION_MAP; + map = COMBINED_HISTORY_PROJECTION_MAP; + map.put(Combined._ID, bookmarkOrHistoryColumn(Combined._ID)); + map.put(Combined.TITLE, bookmarkOrHistoryColumn(Combined.TITLE)); + map.put(Combined.URL, qualifyColumn(TABLE_HISTORY, Combined.URL)); + map.put(Combined.DATE_CREATED, qualifyColumn(TABLE_HISTORY, Combined.DATE_CREATED)); + map.put(Combined.DATE_LAST_VISITED, Combined.DATE_LAST_VISITED); + map.put(Combined.IS_BOOKMARK, "CASE WHEN " + + TABLE_BOOKMARKS + "." + Bookmarks._ID + + " IS NOT NULL THEN 1 ELSE 0 END AS " + Combined.IS_BOOKMARK); + map.put(Combined.VISITS, Combined.VISITS); + map.put(Combined.FAVICON, Combined.FAVICON); + map.put(Combined.THUMBNAIL, Combined.THUMBNAIL); + map.put(Combined.TOUCH_ICON, Combined.TOUCH_ICON); + map.put(Combined.USER_ENTERED, "NULL AS " + Combined.USER_ENTERED); + + // Combined bookmark half + map = COMBINED_BOOKMARK_PROJECTION_MAP; map.put(Combined._ID, Combined._ID); map.put(Combined.TITLE, Combined.TITLE); map.put(Combined.URL, Combined.URL); map.put(Combined.DATE_CREATED, Combined.DATE_CREATED); - map.put(Combined.DATE_LAST_VISITED, Combined.DATE_LAST_VISITED); - map.put(Combined.IS_BOOKMARK, Combined.IS_BOOKMARK); - map.put(Combined.VISITS, Combined.VISITS); + map.put(Combined.DATE_LAST_VISITED, "NULL AS " + Combined.DATE_LAST_VISITED); + map.put(Combined.IS_BOOKMARK, "1 AS " + Combined.IS_BOOKMARK); + map.put(Combined.VISITS, "0 AS " + Combined.VISITS); map.put(Combined.FAVICON, Combined.FAVICON); map.put(Combined.THUMBNAIL, Combined.THUMBNAIL); map.put(Combined.TOUCH_ICON, Combined.TOUCH_ICON); - map.put(Combined.USER_ENTERED, Combined.USER_ENTERED); + map.put(Combined.USER_ENTERED, "NULL AS " + Combined.USER_ENTERED); // Searches map = SEARCHES_PROJECTION_MAP; @@ -252,7 +273,7 @@ public class BrowserProvider2 extends SQLiteContentProvider { final class DatabaseHelper extends SQLiteOpenHelper { static final String DATABASE_NAME = "browser2.db"; - static final int DATABASE_VERSION = 25; + static final int DATABASE_VERSION = 26; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @@ -314,37 +335,6 @@ public class BrowserProvider2 extends SQLiteContentProvider { Settings.VALUE + " TEXT NOT NULL" + ");"); - db.execSQL("CREATE VIEW " + VIEW_COMBINED + " AS " + - "SELECT " + - bookmarkOrHistoryColumn(Combined._ID) + ", " + - bookmarkOrHistoryColumn(Combined.TITLE) + ", " + - qualifyColumn(TABLE_HISTORY, Combined.URL) + ", " + - qualifyColumn(TABLE_HISTORY, Combined.DATE_CREATED) + ", " + - Combined.DATE_LAST_VISITED + ", " + - "CASE WHEN bookmarks._id IS NOT NULL THEN 1 ELSE 0 END AS " + Combined.IS_BOOKMARK + ", " + - Combined.VISITS + ", " + - Combined.FAVICON + ", " + - Combined.THUMBNAIL + ", " + - Combined.TOUCH_ICON + ", " + - "NULL AS " + Combined.USER_ENTERED + " "+ - "FROM history LEFT OUTER JOIN bookmarks ON history.url = bookmarks.url LEFT OUTER JOIN images ON history.url = images.url_key " + - - "UNION ALL " + - - "SELECT " + - Combined._ID + ", " + - Combined.TITLE + ", " + - Combined.URL + ", " + - Combined.DATE_CREATED + ", " + - "NULL AS " + Combined.DATE_LAST_VISITED + ", "+ - "1 AS " + Combined.IS_BOOKMARK + ", " + - "0 AS " + Combined.VISITS + ", "+ - Combined.FAVICON + ", " + - Combined.THUMBNAIL + ", " + - Combined.TOUCH_ICON + ", " + - "NULL AS " + Combined.USER_ENTERED + " "+ - "FROM bookmarks LEFT OUTER JOIN images ON bookmarks.url = images.url_key WHERE url NOT IN (SELECT url FROM history)"); - mSyncHelper.createDatabase(db); createDefaultBookmarks(db); @@ -353,14 +343,16 @@ public class BrowserProvider2 extends SQLiteContentProvider { @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO write upgrade logic - db.execSQL("DROP TABLE IF EXISTS " + TABLE_BOOKMARKS); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_HISTORY); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_SEARCHES); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_IMAGES); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_SETTINGS); - db.execSQL("DROP VIEW IF EXISTS " + VIEW_COMBINED); - mSyncHelper.onAccountsChanged(db, new Account[] {}); // remove all sync info - onCreate(db); + db.execSQL("DROP VIEW IF EXISTS combined"); + if (oldVersion < 25) { + db.execSQL("DROP TABLE IF EXISTS " + TABLE_BOOKMARKS); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_HISTORY); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_SEARCHES); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_IMAGES); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_SETTINGS); + mSyncHelper.onAccountsChanged(db, new Account[] {}); // remove all sync info + onCreate(db); + } } @Override @@ -746,14 +738,19 @@ public class BrowserProvider2 extends SQLiteContentProvider { } case COMBINED_ID: { - selection = DatabaseUtils.concatenateWhere(selection, VIEW_COMBINED + "._id=?"); + selection = DatabaseUtils.concatenateWhere(selection, Combined._ID +"=?"); selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs, new String[] { Long.toString(ContentUris.parseId(uri)) }); // fall through } case COMBINED: { - qb.setTables(VIEW_COMBINED); - qb.setProjectionMap(COMBINED_PROJECTION_MAP); + qb = new SQLiteQueryBuilder(); + String[] args = createCombinedQuery(uri, projection, qb); + if (selectionArgs == null) { + selectionArgs = args; + } else { + selectionArgs = DatabaseUtils.appendSelectionArgs(args, selectionArgs); + } break; } @@ -774,6 +771,54 @@ public class BrowserProvider2 extends SQLiteContentProvider { return cursor; } + private String[] createCombinedQuery( + Uri uri, String[] projection, SQLiteQueryBuilder qb) { + String[] args = null; + // Look for account info + String accountType = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE); + String accountName = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME); + StringBuilder whereBuilder = new StringBuilder(128); + whereBuilder.append(Bookmarks.IS_DELETED); + whereBuilder.append(" = 0 AND "); + if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountType)) { + whereBuilder.append(Bookmarks.ACCOUNT_NAME); + whereBuilder.append("=? AND "); + whereBuilder.append(Bookmarks.ACCOUNT_TYPE); + whereBuilder.append("=?"); + // We use this where twice + args = new String[] { accountName, accountType, + accountName, accountType}; + } else { + whereBuilder.append(Bookmarks.ACCOUNT_NAME); + whereBuilder.append(" IS NULL AND "); + whereBuilder.append(Bookmarks.ACCOUNT_TYPE); + whereBuilder.append(" IS NULL"); + } + String where = whereBuilder.toString(); + // Build the bookmark subquery for history union subquery + qb.setTables(TABLE_BOOKMARKS); + String subQuery = qb.buildQuery(null, where, null, null, null, null); + // Build the history union subquery + qb.setTables(String.format(FORMAT_COMBINED_JOIN_SUBQUERY_JOIN_IMAGES, subQuery)); + qb.setProjectionMap(COMBINED_HISTORY_PROJECTION_MAP); + String historySubQuery = qb.buildQuery(null, + null, null, null, null, null); + // Build the bookmark union subquery + qb.setTables(TABLE_BOOKMARKS_JOIN_IMAGES); + qb.setProjectionMap(COMBINED_BOOKMARK_PROJECTION_MAP); + where += String.format(" AND %s NOT IN (SELECT %s FROM %s)", + Combined.URL, History.URL, TABLE_HISTORY); + String bookmarksSubQuery = qb.buildQuery(null, where, + null, null, null, null); + // Put it all together + String query = qb.buildUnionQuery( + new String[] {historySubQuery, bookmarksSubQuery}, + null, null); + qb.setTables("(" + query + ")"); + qb.setProjectionMap(null); + return args; + } + @Override public int deleteInTransaction(Uri uri, String selection, String[] selectionArgs, boolean callerIsSyncAdapter) { |