110362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root/*
210362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * Copyright (C) 2007 The Android Open Source Project
310362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root *
410362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
510362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * you may not use this file except in compliance with the License.
610362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * You may obtain a copy of the License at
710362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root *
810362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
910362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root *
1010362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * Unless required by applicable law or agreed to in writing, software
1110362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1210362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1310362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * See the License for the specific language governing permissions and
1410362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root * limitations under the License.
1510362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root */
1610362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.test;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.google.android.collect.Sets;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentProvider;
24f6b979a04f38659177e06ff81cf7bc1b87389fe9Makoto Onukiimport android.database.DatabaseErrorHandler;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
2654a16f059040d8680b71e2e962fb438c993b674bAndrew Stadlerimport android.os.FileUtils;
2754a16f059040d8680b71e2e962fb438c993b674bAndrew Stadlerimport android.util.Log;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a class which delegates to the given context, but performs database
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and file operations with a renamed database/file name (prefixes default
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * names with a given prefix).
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class RenamingDelegatingContext extends ContextWrapper {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mFileContext;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mFilePrefix = null;
4454a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler    private File mCacheDir;
4554a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler    private final Object mSync = new Object();
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Set<String> mDatabaseNames = Sets.newHashSet();
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Set<String> mFileNames = Sets.newHashSet();
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static <T extends ContentProvider> T providerWithRenamedContext(
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Class<T> contentProvider, Context c, String filePrefix)
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalAccessException, InstantiationException {
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return providerWithRenamedContext(contentProvider, c, filePrefix, false);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static <T extends ContentProvider> T providerWithRenamedContext(
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Class<T> contentProvider, Context c, String filePrefix,
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean allowAccessToExistingFilesAndDbs)
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalAccessException, InstantiationException {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Class<T> mProviderClass = contentProvider;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        T mProvider = mProviderClass.newInstance();
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RenamingDelegatingContext mContext = new RenamingDelegatingContext(c, filePrefix);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (allowAccessToExistingFilesAndDbs) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext.makeExistingFilesAndDbsAccessible();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mProvider.attachInfo(mContext, null);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mProvider;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Makes accessible all files and databases whose names match the filePrefix that was passed to
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the constructor. Normally only files and databases that were created through this context are
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * accessible.
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void makeExistingFilesAndDbsAccessible() {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] databaseList = mFileContext.databaseList();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String diskName : databaseList) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (shouldDiskNameBeVisible(diskName)) {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabaseNames.add(publicNameFromDiskName(diskName));
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] fileList = mFileContext.fileList();
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String diskName : fileList) {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (shouldDiskNameBeVisible(diskName)) {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFileNames.add(publicNameFromDiskName(diskName));
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns if the given diskName starts with the given prefix or not.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param diskName name of the database/file.
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean shouldDiskNameBeVisible(String diskName) {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return diskName.startsWith(mFilePrefix);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the public name (everything following the prefix) of the given diskName.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param diskName name of the database/file.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String publicNameFromDiskName(String diskName) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!shouldDiskNameBeVisible(diskName)) {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("disk file should not be visible: " + diskName);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return diskName.substring(mFilePrefix.length(), diskName.length());
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context : the context that will be delagated.
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param filePrefix : a prefix with which database and file names will be
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * prefixed.
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public RenamingDelegatingContext(Context context, String filePrefix) {
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFileContext = context;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFilePrefix = filePrefix;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context : the context that will be delagated.
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fileContext : the context that file and db methods will be delgated to
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param filePrefix : a prefix with which database and file names will be
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * prefixed.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public RenamingDelegatingContext(Context context, Context fileContext, String filePrefix) {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFileContext = fileContext;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFilePrefix = filePrefix;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getDatabasePrefix() {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFilePrefix;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String renamedFileName(String name) {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFilePrefix + name;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SQLiteDatabase openOrCreateDatabase(String name,
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mode, SQLiteDatabase.CursorFactory factory) {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String internalName = renamedFileName(name);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mDatabaseNames.contains(name)) {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabaseNames.add(name);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFileContext.deleteDatabase(internalName);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFileContext.openOrCreateDatabase(internalName, mode, factory);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
152f6b979a04f38659177e06ff81cf7bc1b87389fe9Makoto Onuki    public SQLiteDatabase openOrCreateDatabase(String name,
153f6b979a04f38659177e06ff81cf7bc1b87389fe9Makoto Onuki            int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
154f6b979a04f38659177e06ff81cf7bc1b87389fe9Makoto Onuki        final String internalName = renamedFileName(name);
155f6b979a04f38659177e06ff81cf7bc1b87389fe9Makoto Onuki        if (!mDatabaseNames.contains(name)) {
156f6b979a04f38659177e06ff81cf7bc1b87389fe9Makoto Onuki            mDatabaseNames.add(name);
157f6b979a04f38659177e06ff81cf7bc1b87389fe9Makoto Onuki            mFileContext.deleteDatabase(internalName);
158f6b979a04f38659177e06ff81cf7bc1b87389fe9Makoto Onuki        }
159f6b979a04f38659177e06ff81cf7bc1b87389fe9Makoto Onuki        return mFileContext.openOrCreateDatabase(internalName, mode, factory, errorHandler);
160f6b979a04f38659177e06ff81cf7bc1b87389fe9Makoto Onuki    }
161f6b979a04f38659177e06ff81cf7bc1b87389fe9Makoto Onuki
162f6b979a04f38659177e06ff81cf7bc1b87389fe9Makoto Onuki    @Override
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteDatabase(String name) {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDatabaseNames.contains(name)) {
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabaseNames.remove(name);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFileContext.deleteDatabase(renamedFileName(name));
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
171b09296dbd8a5cff3a13308d6fc1ab504a8c63221Andrew Stadler
172b09296dbd8a5cff3a13308d6fc1ab504a8c63221Andrew Stadler    @Override
173b09296dbd8a5cff3a13308d6fc1ab504a8c63221Andrew Stadler    public File getDatabasePath(String name) {
174b09296dbd8a5cff3a13308d6fc1ab504a8c63221Andrew Stadler        return mFileContext.getDatabasePath(renamedFileName(name));
175b09296dbd8a5cff3a13308d6fc1ab504a8c63221Andrew Stadler    }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] databaseList() {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDatabaseNames.toArray(new String[]{});
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileInputStream openFileInput(String name)
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws FileNotFoundException {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String internalName = renamedFileName(name);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFileNames.contains(name)) {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFileContext.openFileInput(internalName);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new FileNotFoundException(internalName);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileOutputStream openFileOutput(String name, int mode)
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws FileNotFoundException {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFileNames.add(name);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFileContext.openFileOutput(renamedFileName(name), mode);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFileStreamPath(String name) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFileContext.getFileStreamPath(renamedFileName(name));
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteFile(String name) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFileNames.contains(name)) {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFileNames.remove(name);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFileContext.deleteFile(renamedFileName(name));
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] fileList() {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFileNames.toArray(new String[]{});
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21954a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler
22054a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler    /**
22154a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler     * In order to support calls to getCacheDir(), we create a temp cache dir (inside the real
22254a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler     * one) and return it instead.  This code is basically getCacheDir(), except it uses the real
22354a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler     * cache dir as the parent directory and creates a test cache dir inside that.
22454a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler     */
22554a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler    @Override
22654a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler    public File getCacheDir() {
22754a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler        synchronized (mSync) {
22854a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler            if (mCacheDir == null) {
22954a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                mCacheDir = new File(mFileContext.getCacheDir(), renamedFileName("cache"));
23054a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler            }
23154a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler            if (!mCacheDir.exists()) {
23254a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                if(!mCacheDir.mkdirs()) {
23354a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                    Log.w("RenamingDelegatingContext", "Unable to create cache directory");
23454a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                    return null;
23554a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                }
23654a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                FileUtils.setPermissions(
23754a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                        mCacheDir.getPath(),
23854a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
23954a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                        -1, -1);
24054a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler            }
24154a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler        }
24254a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler        return mCacheDir;
24354a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler    }
24454a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//    /**
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//     * Given an array of files returns only those whose names indicate that they belong to this
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//     * context.
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//     * @param allFiles the original list of files
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//     * @return the pruned list of files
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//     */
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//    private String[] prunedFileList(String[] allFiles) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        List<String> files = Lists.newArrayList();
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        for (String file : allFiles) {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//            if (file.startsWith(mFilePrefix)) {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                files.add(file);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//            }
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        return files.toArray(new String[]{});
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//    }
26110362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root}
262