18cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck/* 28cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * Copyright (C) 2011 The Android Open Source Project 38cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * 48cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 58cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * you may not use this file except in compliance with the License. 68cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * You may obtain a copy of the License at 78cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * 88cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 98cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * 108cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * Unless required by applicable law or agreed to in writing, software 118cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 128cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * See the License for the specific language governing permissions and 148cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck * limitations under the License. 158cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck */ 168cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckpackage com.android.browser.provider; 178cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 188cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport android.content.ContentProvider; 198cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport android.content.ContentUris; 208cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport android.content.ContentValues; 218cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport android.content.Context; 228cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport android.content.UriMatcher; 238cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport android.database.Cursor; 248cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport android.database.DatabaseUtils; 258cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport android.database.sqlite.SQLiteDatabase; 268cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport android.database.sqlite.SQLiteOpenHelper; 278cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport android.database.sqlite.SQLiteQueryBuilder; 288cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport android.net.Uri; 292b71d6dad1cbdc84da3eed140429a102971a1106John Reckimport android.os.FileUtils; 308cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport android.provider.BrowserContract; 313e455284e1e0432fd533de7f082e1426d152d78dJohn Reckimport android.text.TextUtils; 328cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 338cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckimport java.io.File; 348cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 358cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reckpublic class SnapshotProvider extends ContentProvider { 368cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 378cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public static interface Snapshots { 388cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 398cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public static final Uri CONTENT_URI = Uri.withAppendedPath( 408cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck SnapshotProvider.AUTHORITY_URI, "snapshots"); 418cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public static final String _ID = "_id"; 422b71d6dad1cbdc84da3eed140429a102971a1106John Reck @Deprecated 438cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public static final String VIEWSTATE = "view_state"; 448cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public static final String BACKGROUND = "background"; 458cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public static final String TITLE = "title"; 468cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public static final String URL = "url"; 478cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public static final String FAVICON = "favicon"; 488cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public static final String THUMBNAIL = "thumbnail"; 498cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public static final String DATE_CREATED = "date_created"; 502b71d6dad1cbdc84da3eed140429a102971a1106John Reck public static final String VIEWSTATE_PATH = "viewstate_path"; 512b71d6dad1cbdc84da3eed140429a102971a1106John Reck public static final String VIEWSTATE_SIZE = "viewstate_size"; 528cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 538cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 548cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public static final String AUTHORITY = "com.android.browser.snapshots"; 558cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY); 568cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 578cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck static final String TABLE_SNAPSHOTS = "snapshots"; 588cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck static final int SNAPSHOTS = 10; 598cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck static final int SNAPSHOTS_ID = 11; 608cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); 612b71d6dad1cbdc84da3eed140429a102971a1106John Reck // Workaround that we can't remove the "NOT NULL" constraint on VIEWSTATE 622b71d6dad1cbdc84da3eed140429a102971a1106John Reck static final byte[] NULL_BLOB_HACK = new byte[0]; 638cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 648cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck SnapshotDatabaseHelper mOpenHelper; 658cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 668cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck static { 678cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck URI_MATCHER.addURI(AUTHORITY, "snapshots", SNAPSHOTS); 688cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck URI_MATCHER.addURI(AUTHORITY, "snapshots/#", SNAPSHOTS_ID); 698cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 708cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 718cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck final static class SnapshotDatabaseHelper extends SQLiteOpenHelper { 728cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 738cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck static final String DATABASE_NAME = "snapshots.db"; 742b71d6dad1cbdc84da3eed140429a102971a1106John Reck static final int DATABASE_VERSION = 3; 758cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 768cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public SnapshotDatabaseHelper(Context context) { 772b71d6dad1cbdc84da3eed140429a102971a1106John Reck super(context, DATABASE_NAME, null, DATABASE_VERSION); 788cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 798cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 808cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck @Override 818cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public void onCreate(SQLiteDatabase db) { 828cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck db.execSQL("CREATE TABLE " + TABLE_SNAPSHOTS + "(" + 838cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck Snapshots._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 848cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck Snapshots.TITLE + " TEXT," + 858cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck Snapshots.URL + " TEXT NOT NULL," + 868cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck Snapshots.DATE_CREATED + " INTEGER," + 878cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck Snapshots.FAVICON + " BLOB," + 888cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck Snapshots.THUMBNAIL + " BLOB," + 898cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck Snapshots.BACKGROUND + " INTEGER," + 902b71d6dad1cbdc84da3eed140429a102971a1106John Reck Snapshots.VIEWSTATE + " BLOB NOT NULL," + 912b71d6dad1cbdc84da3eed140429a102971a1106John Reck Snapshots.VIEWSTATE_PATH + " TEXT," + 925eac0b68bf5f16db1bcc2980f1ccb148afde7d71John Reck Snapshots.VIEWSTATE_SIZE + " INTEGER" + 938cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck ");"); 948cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 958cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 968cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck @Override 978cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 9868ca4ab8075cd087c9325154c9488d2420fae9f1John Reck if (oldVersion < 2) { 9968ca4ab8075cd087c9325154c9488d2420fae9f1John Reck db.execSQL("DROP TABLE " + TABLE_SNAPSHOTS); 10068ca4ab8075cd087c9325154c9488d2420fae9f1John Reck onCreate(db); 10168ca4ab8075cd087c9325154c9488d2420fae9f1John Reck } 1022b71d6dad1cbdc84da3eed140429a102971a1106John Reck if (oldVersion < 3) { 1032b71d6dad1cbdc84da3eed140429a102971a1106John Reck db.execSQL("ALTER TABLE " + TABLE_SNAPSHOTS + " ADD COLUMN " 1042b71d6dad1cbdc84da3eed140429a102971a1106John Reck + Snapshots.VIEWSTATE_PATH + " TEXT"); 1052b71d6dad1cbdc84da3eed140429a102971a1106John Reck db.execSQL("ALTER TABLE " + TABLE_SNAPSHOTS + " ADD COLUMN " 1062b71d6dad1cbdc84da3eed140429a102971a1106John Reck + Snapshots.VIEWSTATE_SIZE + " INTEGER"); 1072b71d6dad1cbdc84da3eed140429a102971a1106John Reck db.execSQL("UPDATE " + TABLE_SNAPSHOTS + " SET " 1082b71d6dad1cbdc84da3eed140429a102971a1106John Reck + Snapshots.VIEWSTATE_SIZE + " = length(" 1092b71d6dad1cbdc84da3eed140429a102971a1106John Reck + Snapshots.VIEWSTATE + ")"); 1102b71d6dad1cbdc84da3eed140429a102971a1106John Reck } 1118cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1128cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 1138cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1148cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 1152b71d6dad1cbdc84da3eed140429a102971a1106John Reck static File getOldDatabasePath(Context context) { 1162b71d6dad1cbdc84da3eed140429a102971a1106John Reck File dir = context.getExternalFilesDir(null); 1172b71d6dad1cbdc84da3eed140429a102971a1106John Reck return new File(dir, SnapshotDatabaseHelper.DATABASE_NAME); 1188cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1198cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 1202b71d6dad1cbdc84da3eed140429a102971a1106John Reck private void migrateToDataFolder() { 1212b71d6dad1cbdc84da3eed140429a102971a1106John Reck File dbPath = getContext().getDatabasePath(SnapshotDatabaseHelper.DATABASE_NAME); 1222b71d6dad1cbdc84da3eed140429a102971a1106John Reck if (dbPath.exists()) return; 1232b71d6dad1cbdc84da3eed140429a102971a1106John Reck File oldPath = getOldDatabasePath(getContext()); 1242b71d6dad1cbdc84da3eed140429a102971a1106John Reck if (oldPath.exists()) { 1252b71d6dad1cbdc84da3eed140429a102971a1106John Reck // Try to move 1262b71d6dad1cbdc84da3eed140429a102971a1106John Reck if (!oldPath.renameTo(dbPath)) { 1272b71d6dad1cbdc84da3eed140429a102971a1106John Reck // Failed, do a copy 1282b71d6dad1cbdc84da3eed140429a102971a1106John Reck FileUtils.copyFile(oldPath, dbPath); 1298cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1302b71d6dad1cbdc84da3eed140429a102971a1106John Reck // Cleanup 1312b71d6dad1cbdc84da3eed140429a102971a1106John Reck oldPath.delete(); 1328cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1332b71d6dad1cbdc84da3eed140429a102971a1106John Reck } 1342b71d6dad1cbdc84da3eed140429a102971a1106John Reck 1352b71d6dad1cbdc84da3eed140429a102971a1106John Reck @Override 1362b71d6dad1cbdc84da3eed140429a102971a1106John Reck public boolean onCreate() { 1372b71d6dad1cbdc84da3eed140429a102971a1106John Reck migrateToDataFolder(); 1382b71d6dad1cbdc84da3eed140429a102971a1106John Reck mOpenHelper = new SnapshotDatabaseHelper(getContext()); 1392b71d6dad1cbdc84da3eed140429a102971a1106John Reck return true; 1402b71d6dad1cbdc84da3eed140429a102971a1106John Reck } 1418cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 1428cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck SQLiteDatabase getWritableDatabase() { 1432b71d6dad1cbdc84da3eed140429a102971a1106John Reck return mOpenHelper.getWritableDatabase(); 1448cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1458cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 1468cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck SQLiteDatabase getReadableDatabase() { 1472b71d6dad1cbdc84da3eed140429a102971a1106John Reck return mOpenHelper.getReadableDatabase(); 1488cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1498cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 1508cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck @Override 1518cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public Cursor query(Uri uri, String[] projection, String selection, 1528cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck String[] selectionArgs, String sortOrder) { 1538cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck SQLiteDatabase db = getReadableDatabase(); 1548cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck if (db == null) { 1558cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck return null; 1568cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1578cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck final int match = URI_MATCHER.match(uri); 1588cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 1598cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck String limit = uri.getQueryParameter(BrowserContract.PARAM_LIMIT); 1608cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck switch (match) { 1618cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck case SNAPSHOTS_ID: 1628cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck selection = DatabaseUtils.concatenateWhere(selection, "_id=?"); 1638cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs, 1648cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck new String[] { Long.toString(ContentUris.parseId(uri)) }); 1658cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck // fall through 1668cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck case SNAPSHOTS: 1678cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck qb.setTables(TABLE_SNAPSHOTS); 1688cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck break; 1698cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 1708cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck default: 1718cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck throw new UnsupportedOperationException("Unknown URL " + uri.toString()); 1728cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1732b71d6dad1cbdc84da3eed140429a102971a1106John Reck Cursor cursor = qb.query(db, projection, selection, selectionArgs, 1742b71d6dad1cbdc84da3eed140429a102971a1106John Reck null, null, sortOrder, limit); 1752b71d6dad1cbdc84da3eed140429a102971a1106John Reck cursor.setNotificationUri(getContext().getContentResolver(), 1762b71d6dad1cbdc84da3eed140429a102971a1106John Reck AUTHORITY_URI); 1772b71d6dad1cbdc84da3eed140429a102971a1106John Reck return cursor; 1788cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1798cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 1808cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck @Override 1818cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public String getType(Uri uri) { 1828cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck return null; 1838cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1848cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 1858cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck @Override 1868cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public Uri insert(Uri uri, ContentValues values) { 1878cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck SQLiteDatabase db = getWritableDatabase(); 1888cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck if (db == null) { 1898cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck return null; 1908cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1918cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck int match = URI_MATCHER.match(uri); 1928cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck long id = -1; 1938cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck switch (match) { 1948cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck case SNAPSHOTS: 1952b71d6dad1cbdc84da3eed140429a102971a1106John Reck if (!values.containsKey(Snapshots.VIEWSTATE)) { 1962b71d6dad1cbdc84da3eed140429a102971a1106John Reck values.put(Snapshots.VIEWSTATE, NULL_BLOB_HACK); 1978cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 1982b71d6dad1cbdc84da3eed140429a102971a1106John Reck id = db.insert(TABLE_SNAPSHOTS, Snapshots.TITLE, values); 1998cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck break; 2008cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck default: 2018cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck throw new UnsupportedOperationException("Unknown insert URI " + uri); 2028cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 2038cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck if (id < 0) { 2048cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck return null; 2058cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 2068cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck Uri inserted = ContentUris.withAppendedId(uri, id); 2078cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck getContext().getContentResolver().notifyChange(inserted, null, false); 2088cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck return inserted; 2098cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 2108cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 2112b71d6dad1cbdc84da3eed140429a102971a1106John Reck static final String[] DELETE_PROJECTION = new String[] { 2122b71d6dad1cbdc84da3eed140429a102971a1106John Reck Snapshots.VIEWSTATE_PATH, 2132b71d6dad1cbdc84da3eed140429a102971a1106John Reck }; 2142b71d6dad1cbdc84da3eed140429a102971a1106John Reck private void deleteDataFiles(SQLiteDatabase db, String selection, 2152b71d6dad1cbdc84da3eed140429a102971a1106John Reck String[] selectionArgs) { 2162b71d6dad1cbdc84da3eed140429a102971a1106John Reck Cursor c = db.query(TABLE_SNAPSHOTS, DELETE_PROJECTION, selection, 2172b71d6dad1cbdc84da3eed140429a102971a1106John Reck selectionArgs, null, null, null); 2182b71d6dad1cbdc84da3eed140429a102971a1106John Reck final Context context = getContext(); 2192b71d6dad1cbdc84da3eed140429a102971a1106John Reck while (c.moveToNext()) { 2203e455284e1e0432fd533de7f082e1426d152d78dJohn Reck String filename = c.getString(0); 2213e455284e1e0432fd533de7f082e1426d152d78dJohn Reck if (TextUtils.isEmpty(filename)) { 2223e455284e1e0432fd533de7f082e1426d152d78dJohn Reck continue; 2233e455284e1e0432fd533de7f082e1426d152d78dJohn Reck } 2243e455284e1e0432fd533de7f082e1426d152d78dJohn Reck File f = context.getFileStreamPath(filename); 2252b71d6dad1cbdc84da3eed140429a102971a1106John Reck if (f.exists()) { 2262b71d6dad1cbdc84da3eed140429a102971a1106John Reck if (!f.delete()) { 2272b71d6dad1cbdc84da3eed140429a102971a1106John Reck f.deleteOnExit(); 2282b71d6dad1cbdc84da3eed140429a102971a1106John Reck } 2292b71d6dad1cbdc84da3eed140429a102971a1106John Reck } 2302b71d6dad1cbdc84da3eed140429a102971a1106John Reck } 2312b71d6dad1cbdc84da3eed140429a102971a1106John Reck c.close(); 2322b71d6dad1cbdc84da3eed140429a102971a1106John Reck } 2332b71d6dad1cbdc84da3eed140429a102971a1106John Reck 2348cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck @Override 2358cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public int delete(Uri uri, String selection, String[] selectionArgs) { 2368cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck SQLiteDatabase db = getWritableDatabase(); 2378cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck if (db == null) { 2388cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck return 0; 2398cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 2408cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck int match = URI_MATCHER.match(uri); 2418cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck int deleted = 0; 2428cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck switch (match) { 2438cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck case SNAPSHOTS_ID: { 2448cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck selection = DatabaseUtils.concatenateWhere(selection, TABLE_SNAPSHOTS + "._id=?"); 2458cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs, 2468cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck new String[] { Long.toString(ContentUris.parseId(uri)) }); 2478cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck // fall through 2488cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 2498cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck case SNAPSHOTS: 2502b71d6dad1cbdc84da3eed140429a102971a1106John Reck deleteDataFiles(db, selection, selectionArgs); 2512b71d6dad1cbdc84da3eed140429a102971a1106John Reck deleted = db.delete(TABLE_SNAPSHOTS, selection, selectionArgs); 2528cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck break; 2538cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck default: 2548cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck throw new UnsupportedOperationException("Unknown delete URI " + uri); 2558cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 2568cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck if (deleted > 0) { 2578cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck getContext().getContentResolver().notifyChange(uri, null, false); 2588cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 2598cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck return deleted; 2608cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 2618cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 2628cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck @Override 2638cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck public int update(Uri uri, ContentValues values, String selection, 2648cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck String[] selectionArgs) { 2658cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck throw new UnsupportedOperationException("not implemented"); 2668cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck } 2678cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck 2688cc9235816ac9b3f1b3551d6234684f0455746dcJohn Reck} 269