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