diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 4616af8f77689..8d9ceb6ac58ce 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -379,6 +379,24 @@ public class Environment { return new File(getDataPreloadsDirectory(), "media"); } + /** + * Returns location of preloaded cache directory for package name + * @see #getDataPreloadsDirectory() + * {@hide} + */ + public static File getDataPreloadsFileCacheDirectory(String packageName) { + return new File(getDataPreloadsFileCacheDirectory(), packageName); + } + + /** + * Returns location of preloaded cache directory. + * @see #getDataPreloadsDirectory() + * {@hide} + */ + public static File getDataPreloadsFileCacheDirectory() { + return new File(getDataPreloadsDirectory(), "file_cache"); + } + /** * Return the primary shared/external storage directory. This directory may * not currently be accessible if it has been mounted by the user on their diff --git a/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java b/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java index af19acb133f7b..f89fd47df4e65 100644 --- a/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java +++ b/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java @@ -254,12 +254,9 @@ public class RetailDemoModeService extends SystemService { mInjector.systemPropertiesSet(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "0"); // Run on the bg thread to not block the fg thread - BackgroundThread.getHandler().post(new Runnable() { - @Override - public void run() { - if (!deletePreloadsFolderContents()) { - Slog.w(TAG, "Failed to delete preloads folder contents"); - } + BackgroundThread.getHandler().post(() -> { + if (!deletePreloadsFolderContents()) { + Slog.w(TAG, "Failed to delete preloads folder contents"); } }); @@ -443,8 +440,29 @@ public class RetailDemoModeService extends SystemService { private boolean deletePreloadsFolderContents() { final File dir = mInjector.getDataPreloadsDirectory(); + final File[] files = FileUtils.listFilesOrEmpty(dir); + final File fileCacheDirectory = mInjector.getDataPreloadsFileCacheDirectory(); Slog.i(TAG, "Deleting contents of " + dir); - return FileUtils.deleteContents(dir); + boolean success = true; + for (File file : files) { + if (file.isFile()) { + if (!file.delete()) { + success = false; + Slog.w(TAG, "Cannot delete file " + file); + } + } else { + // Do not remove file_cache dir + if (!file.equals(fileCacheDirectory)) { + if (!FileUtils.deleteContentsAndDir(file)) { + success = false; + Slog.w(TAG, "Cannot delete dir and its content " + file); + } + } else { + Slog.i(TAG, "Skipping directory with file cache " + file); + } + } + } + return success; } private void registerBroadcastReceiver() { @@ -818,6 +836,10 @@ public class RetailDemoModeService extends SystemService { return Environment.getDataPreloadsDirectory(); } + File getDataPreloadsFileCacheDirectory() { + return Environment.getDataPreloadsFileCacheDirectory(); + } + void publishLocalService(RetailDemoModeService service, RetailDemoModeServiceInternal localService) { service.publishLocalService(RetailDemoModeServiceInternal.class, localService); diff --git a/services/tests/servicestests/src/com/android/server/retaildemo/RetailDemoModeServiceTest.java b/services/tests/servicestests/src/com/android/server/retaildemo/RetailDemoModeServiceTest.java index d53fdf6c4aa94..e1dda5198a360 100644 --- a/services/tests/servicestests/src/com/android/server/retaildemo/RetailDemoModeServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/retaildemo/RetailDemoModeServiceTest.java @@ -448,6 +448,11 @@ public class RetailDemoModeServiceTest { return mTestPreloadsDir; } + @Override + File getDataPreloadsFileCacheDirectory() { + return new File(mTestPreloadsDir, "file_cache"); + } + @Override void publishLocalService(RetailDemoModeService service, RetailDemoModeServiceInternal localService) {