RenamingDelegatingContext.java revision 10362ab9d67d87c0c3217e804e64d3e7038211df
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;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase;
2554a16f059040d8680b71e2e962fb438c993b674bAndrew Stadlerimport android.os.FileUtils;
2654a16f059040d8680b71e2e962fb438c993b674bAndrew Stadlerimport android.util.Log;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a class which delegates to the given context, but performs database
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and file operations with a renamed database/file name (prefixes default
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * names with a given prefix).
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class RenamingDelegatingContext extends ContextWrapper {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mFileContext;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mFilePrefix = null;
4354a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler    private File mCacheDir;
4454a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler    private final Object mSync = new Object();
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Set<String> mDatabaseNames = Sets.newHashSet();
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Set<String> mFileNames = Sets.newHashSet();
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static <T extends ContentProvider> T providerWithRenamedContext(
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Class<T> contentProvider, Context c, String filePrefix)
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalAccessException, InstantiationException {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return providerWithRenamedContext(contentProvider, c, filePrefix, false);
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static <T extends ContentProvider> T providerWithRenamedContext(
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Class<T> contentProvider, Context c, String filePrefix,
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean allowAccessToExistingFilesAndDbs)
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IllegalAccessException, InstantiationException {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Class<T> mProviderClass = contentProvider;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        T mProvider = mProviderClass.newInstance();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RenamingDelegatingContext mContext = new RenamingDelegatingContext(c, filePrefix);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (allowAccessToExistingFilesAndDbs) {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext.makeExistingFilesAndDbsAccessible();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mProvider.attachInfo(mContext, null);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mProvider;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Makes accessible all files and databases whose names match the filePrefix that was passed to
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the constructor. Normally only files and databases that were created through this context are
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * accessible.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void makeExistingFilesAndDbsAccessible() {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] databaseList = mFileContext.databaseList();
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String diskName : databaseList) {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (shouldDiskNameBeVisible(diskName)) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDatabaseNames.add(publicNameFromDiskName(diskName));
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] fileList = mFileContext.fileList();
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String diskName : fileList) {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (shouldDiskNameBeVisible(diskName)) {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFileNames.add(publicNameFromDiskName(diskName));
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
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     * Returns if the given diskName starts with the given prefix or not.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param diskName name of the database/file.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean shouldDiskNameBeVisible(String diskName) {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return diskName.startsWith(mFilePrefix);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the public name (everything following the prefix) of the given diskName.
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param diskName name of the database/file.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String publicNameFromDiskName(String diskName) {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!shouldDiskNameBeVisible(diskName)) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("disk file should not be visible: " + diskName);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return diskName.substring(mFilePrefix.length(), diskName.length());
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context : the context that will be delagated.
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param filePrefix : a prefix with which database and file names will be
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * prefixed.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public RenamingDelegatingContext(Context context, String filePrefix) {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFileContext = context;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFilePrefix = filePrefix;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context : the context that will be delagated.
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fileContext : the context that file and db methods will be delgated to
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param filePrefix : a prefix with which database and file names will be
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * prefixed.
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public RenamingDelegatingContext(Context context, Context fileContext, String filePrefix) {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFileContext = fileContext;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFilePrefix = filePrefix;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getDatabasePrefix() {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFilePrefix;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String renamedFileName(String name) {
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFilePrefix + name;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SQLiteDatabase openOrCreateDatabase(String name,
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mode, SQLiteDatabase.CursorFactory factory) {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String internalName = renamedFileName(name);
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mDatabaseNames.contains(name)) {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabaseNames.add(name);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFileContext.deleteDatabase(internalName);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFileContext.openOrCreateDatabase(internalName, mode, factory);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteDatabase(String name) {
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDatabaseNames.contains(name)) {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDatabaseNames.remove(name);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFileContext.deleteDatabase(renamedFileName(name));
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
159b09296dbd8a5cff3a13308d6fc1ab504a8c63221Andrew Stadler
160b09296dbd8a5cff3a13308d6fc1ab504a8c63221Andrew Stadler    @Override
161b09296dbd8a5cff3a13308d6fc1ab504a8c63221Andrew Stadler    public File getDatabasePath(String name) {
162b09296dbd8a5cff3a13308d6fc1ab504a8c63221Andrew Stadler        return mFileContext.getDatabasePath(renamedFileName(name));
163b09296dbd8a5cff3a13308d6fc1ab504a8c63221Andrew Stadler    }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] databaseList() {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDatabaseNames.toArray(new String[]{});
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileInputStream openFileInput(String name)
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws FileNotFoundException {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String internalName = renamedFileName(name);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFileNames.contains(name)) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFileContext.openFileInput(internalName);
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new FileNotFoundException(internalName);
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FileOutputStream openFileOutput(String name, int mode)
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws FileNotFoundException {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFileNames.add(name);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFileContext.openFileOutput(renamedFileName(name), mode);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getFileStreamPath(String name) {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFileContext.getFileStreamPath(renamedFileName(name));
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean deleteFile(String name) {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFileNames.contains(name)) {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFileNames.remove(name);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mFileContext.deleteFile(renamedFileName(name));
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] fileList() {
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFileNames.toArray(new String[]{});
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20754a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler
20854a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler    /**
20954a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler     * In order to support calls to getCacheDir(), we create a temp cache dir (inside the real
21054a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler     * one) and return it instead.  This code is basically getCacheDir(), except it uses the real
21154a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler     * cache dir as the parent directory and creates a test cache dir inside that.
21254a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler     */
21354a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler    @Override
21454a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler    public File getCacheDir() {
21554a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler        synchronized (mSync) {
21654a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler            if (mCacheDir == null) {
21754a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                mCacheDir = new File(mFileContext.getCacheDir(), renamedFileName("cache"));
21854a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler            }
21954a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler            if (!mCacheDir.exists()) {
22054a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                if(!mCacheDir.mkdirs()) {
22154a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                    Log.w("RenamingDelegatingContext", "Unable to create cache directory");
22254a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                    return null;
22354a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                }
22454a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                FileUtils.setPermissions(
22554a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                        mCacheDir.getPath(),
22654a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
22754a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler                        -1, -1);
22854a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler            }
22954a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler        }
23054a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler        return mCacheDir;
23154a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler    }
23254a16f059040d8680b71e2e962fb438c993b674bAndrew Stadler
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//    /**
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//     * Given an array of files returns only those whose names indicate that they belong to this
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//     * context.
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//     * @param allFiles the original list of files
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//     * @return the pruned list of files
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//     */
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//    private String[] prunedFileList(String[] allFiles) {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        List<String> files = Lists.newArrayList();
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        for (String file : allFiles) {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//            if (file.startsWith(mFilePrefix)) {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                files.add(file);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//            }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        return files.toArray(new String[]{});
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//    }
24910362ab9d67d87c0c3217e804e64d3e7038211dfKenny Root}
250