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 } 66334d9aebc28f7d5213b1671997488b3e3f118e29Dianne Hackborn mProvider.attachInfoForTesting(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 /** 11073fca8ed2bfc314afb9b8cfa67fc64f1d26ab4c3Evan Charlton * @param context : the context that will be delegated. 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 /** 12173fca8ed2bfc314afb9b8cfa67fc64f1d26ab4c3Evan Charlton * @param context : the context that will be delegated. 12273fca8ed2bfc314afb9b8cfa67fc64f1d26ab4c3Evan Charlton * @param fileContext : the context that file and db methods will be delegated 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