Index: sky/shell/android/org/domokit/sky/shell/ResourceCleaner.java |
diff --git a/sky/shell/android/org/domokit/sky/shell/ResourceCleaner.java b/sky/shell/android/org/domokit/sky/shell/ResourceCleaner.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8aa43a9628d195d05237dc8a972b3437cb7e2db1 |
--- /dev/null |
+++ b/sky/shell/android/org/domokit/sky/shell/ResourceCleaner.java |
@@ -0,0 +1,86 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.domokit.sky.shell; |
+ |
+import android.content.Context; |
+import android.os.AsyncTask; |
+import android.os.Handler; |
+import android.util.Log; |
+ |
+import java.io.File; |
+import java.io.FilenameFilter; |
+ |
+/** |
+ * A class to clean up orphaned resource directories after unclean shutdowns. |
+ **/ |
+public class ResourceCleaner { |
+ private static final String TAG = "ResourceCleaner"; |
+ private static final String TEMPORARY_RESOURCE_PREFIX = ".org.chromium.Chromium."; |
+ private static final long DELAY_MS = 5000; |
+ |
+ private class CleanTask extends AsyncTask<Void, Void, Void> { |
+ private final File[] mFilesToDelete; |
+ |
+ public CleanTask(File[] filesToDelete) { |
+ mFilesToDelete = filesToDelete; |
+ } |
+ |
+ public boolean hasFilesToDelete() { |
+ return mFilesToDelete.length > 0; |
+ } |
+ |
+ @Override |
+ protected Void doInBackground(Void... unused) { |
+ Log.i(TAG, "Cleaning " + mFilesToDelete.length + " resources."); |
+ for (File file : mFilesToDelete) { |
+ if (file.exists()) { |
+ deleteRecursively(file); |
+ } |
+ } |
+ return null; |
+ } |
+ |
+ private void deleteRecursively(File parent) { |
+ if (parent.isDirectory()) { |
+ for (File child : parent.listFiles()) { |
+ deleteRecursively(child); |
+ } |
+ } |
+ parent.delete(); |
+ } |
+ } |
+ |
+ private final Context mContext; |
+ |
+ public ResourceCleaner(Context context) { |
+ mContext = context; |
+ } |
+ |
+ public void start() { |
+ File cacheDir = mContext.getCacheDir(); |
+ if (cacheDir == null) { |
+ return; |
+ } |
+ |
+ final CleanTask task = new CleanTask(cacheDir.listFiles(new FilenameFilter() { |
+ @Override |
+ public boolean accept(File dir, String name) { |
+ boolean result = name.startsWith(TEMPORARY_RESOURCE_PREFIX); |
+ return result; |
+ } |
+ })); |
+ |
+ if (!task.hasFilesToDelete()) { |
+ return; |
+ } |
+ |
+ new Handler().postDelayed(new Runnable() { |
+ @Override |
+ public void run() { |
+ task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); |
+ } |
+ }, DELAY_MS); |
+ } |
+} |