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