Index: base/android/java/src/org/chromium/base/PathUtils.java |
diff --git a/base/android/java/src/org/chromium/base/PathUtils.java b/base/android/java/src/org/chromium/base/PathUtils.java |
index d70c0cc95ead4185f7a68fa1da2310db2b09a43d..5da080e834d6e684b53e272c7b4cc38eaf2cfbe3 100644 |
--- a/base/android/java/src/org/chromium/base/PathUtils.java |
+++ b/base/android/java/src/org/chromium/base/PathUtils.java |
@@ -6,26 +6,58 @@ package org.chromium.base; |
import android.content.Context; |
import android.content.pm.ApplicationInfo; |
+import android.os.AsyncTask; |
import android.os.Environment; |
+import java.util.concurrent.ExecutionException; |
+ |
/** |
* This class provides the path related methods for the native library. |
*/ |
public abstract class PathUtils { |
- private static String sDataDirectorySuffix; |
+ private static final int DATA_DIRECTORY = 0; |
+ private static final int DATABASE_DIRECTORY = 1; |
+ private static final int CACHE_DIRECTORY = 2; |
+ private static final int NUM_DIRECTORIES = 3; |
+ private static AsyncTask<String, Void, String[]> sDirPathFetchTask; |
// Prevent instantiation. |
private PathUtils() {} |
/** |
- * Sets the suffix that should be used for the directory where private data is to be stored |
- * by the application. |
+ * Starts an asynchronous task to fetch the path of the directory where private data is to be |
+ * stored by the application. |
+ * |
* @param suffix The private data directory suffix. |
* @see Context#getDir(String, int) |
*/ |
- public static void setPrivateDataDirectorySuffix(String suffix) { |
- sDataDirectorySuffix = suffix; |
+ public static void setPrivateDataDirectorySuffix(String suffix, Context context) { |
+ final Context appContext = context.getApplicationContext(); |
+ sDirPathFetchTask = new AsyncTask<String, Void, String[]>() { |
+ @Override |
+ protected String[] doInBackground(String... dataDirectorySuffix) { |
+ String[] paths = new String[NUM_DIRECTORIES]; |
+ paths[DATA_DIRECTORY] = |
+ appContext.getDir(dataDirectorySuffix[0], Context.MODE_PRIVATE).getPath(); |
+ paths[DATABASE_DIRECTORY] = appContext.getDatabasePath("foo").getParent(); |
+ paths[CACHE_DIRECTORY] = appContext.getCacheDir().getPath(); |
+ return paths; |
+ } |
+ }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, suffix); |
+ } |
+ |
+ /** |
+ * @param index The index of the cached directory path. |
+ * @return The directory path requested, or null if not available. |
+ */ |
+ private static String getDirectoryPath(int index) { |
+ try { |
+ return sDirPathFetchTask.get()[index]; |
+ } catch (InterruptedException e) { |
+ } catch (ExecutionException e) { |
+ } |
+ return null; |
} |
/** |
@@ -33,11 +65,8 @@ public abstract class PathUtils { |
*/ |
@CalledByNative |
public static String getDataDirectory(Context appContext) { |
- if (sDataDirectorySuffix == null) { |
- throw new IllegalStateException( |
- "setDataDirectorySuffix must be called before getDataDirectory"); |
- } |
- return appContext.getDir(sDataDirectorySuffix, Context.MODE_PRIVATE).getPath(); |
+ assert sDirPathFetchTask != null : "setDataDirectorySuffix must be called first."; |
+ return getDirectoryPath(DATA_DIRECTORY); |
} |
/** |
@@ -45,8 +74,8 @@ public abstract class PathUtils { |
*/ |
@CalledByNative |
public static String getDatabaseDirectory(Context appContext) { |
- // Context.getDatabasePath() returns path for the provided filename. |
- return appContext.getDatabasePath("foo").getParent(); |
+ assert sDirPathFetchTask != null : "setDataDirectorySuffix must be called first."; |
+ return getDirectoryPath(DATABASE_DIRECTORY); |
} |
/** |
@@ -55,7 +84,8 @@ public abstract class PathUtils { |
@SuppressWarnings("unused") |
@CalledByNative |
public static String getCacheDirectory(Context appContext) { |
- return appContext.getCacheDir().getPath(); |
+ assert sDirPathFetchTask != null : "setDataDirectorySuffix must be called first."; |
+ return getDirectoryPath(CACHE_DIRECTORY); |
} |
/** |