summaryrefslogtreecommitdiffstats
path: root/core/java/android/app
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/app')
-rw-r--r--core/java/android/app/ContextImpl.java113
-rw-r--r--core/java/android/app/NativeActivity.java9
2 files changed, 71 insertions, 51 deletions
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index eb5c3e7..cdec399 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -111,6 +111,7 @@ import android.accounts.AccountManager;
import android.accounts.IAccountManager;
import android.app.admin.DevicePolicyManager;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IAppOpsService;
import com.android.internal.os.IDropBoxManagerService;
@@ -197,13 +198,21 @@ class ContextImpl extends Context {
private final Object mSync = new Object();
+ @GuardedBy("mSync")
private File mDatabasesDir;
+ @GuardedBy("mSync")
private File mPreferencesDir;
+ @GuardedBy("mSync")
private File mFilesDir;
+ @GuardedBy("mSync")
private File mCacheDir;
- private File mObbDir;
- private File mExternalFilesDir;
- private File mExternalCacheDir;
+
+ @GuardedBy("mSync")
+ private File[] mExternalObbDirs;
+ @GuardedBy("mSync")
+ private File[] mExternalFilesDirs;
+ @GuardedBy("mSync")
+ private File[] mExternalCacheDirs;
private static final String[] EMPTY_FILE_LIST = {};
@@ -802,44 +811,41 @@ class ContextImpl extends Context {
@Override
public File getExternalFilesDir(String type) {
+ // Operates on primary external storage
+ return getExternalFilesDirs(type)[0];
+ }
+
+ @Override
+ public File[] getExternalFilesDirs(String type) {
synchronized (mSync) {
- if (mExternalFilesDir == null) {
- mExternalFilesDir = Environment.getExternalStorageAppFilesDirectory(
- getPackageName());
- }
- if (!mExternalFilesDir.exists()) {
- try {
- (new File(Environment.getExternalStorageAndroidDataDir(),
- ".nomedia")).createNewFile();
- } catch (IOException e) {
- }
- if (!mExternalFilesDir.mkdirs()) {
- Log.w(TAG, "Unable to create external files directory");
- return null;
- }
- }
- if (type == null) {
- return mExternalFilesDir;
+ if (mExternalFilesDirs == null) {
+ mExternalFilesDirs = Environment.buildExternalStorageAppFilesDirs(getPackageName());
}
- File dir = new File(mExternalFilesDir, type);
- if (!dir.exists()) {
- if (!dir.mkdirs()) {
- Log.w(TAG, "Unable to create external media directory " + dir);
- return null;
- }
+
+ // Splice in requested type, if any
+ File[] dirs = mExternalFilesDirs;
+ if (type != null) {
+ dirs = Environment.buildPaths(dirs, type);
}
- return dir;
+
+ // Create dirs if needed
+ return ensureDirsExistOrFilter(dirs);
}
}
@Override
public File getObbDir() {
+ // Operates on primary external storage
+ return getObbDirs()[0];
+ }
+
+ @Override
+ public File[] getObbDirs() {
synchronized (mSync) {
- if (mObbDir == null) {
- mObbDir = Environment.getExternalStorageAppObbDirectory(
- getPackageName());
+ if (mExternalObbDirs == null) {
+ mExternalObbDirs = Environment.buildExternalStorageAppObbDirs(getPackageName());
}
- return mObbDir;
+ return mExternalObbDirs;
}
}
@@ -865,23 +871,19 @@ class ContextImpl extends Context {
@Override
public File getExternalCacheDir() {
+ // Operates on primary external storage
+ return getExternalCacheDirs()[0];
+ }
+
+ @Override
+ public File[] getExternalCacheDirs() {
synchronized (mSync) {
- if (mExternalCacheDir == null) {
- mExternalCacheDir = Environment.getExternalStorageAppCacheDirectory(
- getPackageName());
+ if (mExternalCacheDirs == null) {
+ mExternalCacheDirs = Environment.buildExternalStorageAppCacheDirs(getPackageName());
}
- if (!mExternalCacheDir.exists()) {
- try {
- (new File(Environment.getExternalStorageAndroidDataDir(),
- ".nomedia")).createNewFile();
- } catch (IOException e) {
- }
- if (!mExternalCacheDir.mkdirs()) {
- Log.w(TAG, "Unable to create external cache directory");
- return null;
- }
- }
- return mExternalCacheDir;
+
+ // Create dirs if needed
+ return ensureDirsExistOrFilter(mExternalCacheDirs);
}
}
@@ -2081,6 +2083,25 @@ class ContextImpl extends Context {
"File " + name + " contains a path separator");
}
+ /**
+ * Ensure that given directories exist, trying to create them if missing. If
+ * unable to create, they are filtered by replacing with {@code null}.
+ */
+ private static File[] ensureDirsExistOrFilter(File[] dirs) {
+ File[] result = new File[dirs.length];
+ for (int i = 0; i < dirs.length; i++) {
+ File dir = dirs[i];
+ if (!dir.exists()) {
+ if (!dir.mkdirs()) {
+ Log.w(TAG, "Failed to ensure directory: " + dir);
+ dir = null;
+ }
+ }
+ result[i] = dir;
+ }
+ return result;
+ }
+
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
diff --git a/core/java/android/app/NativeActivity.java b/core/java/android/app/NativeActivity.java
index 63c6acd..b84889f 100644
--- a/core/java/android/app/NativeActivity.java
+++ b/core/java/android/app/NativeActivity.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package android.app;
import android.content.Context;
@@ -23,17 +24,15 @@ import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.Bundle;
-import android.os.Environment;
import android.os.Looper;
import android.os.MessageQueue;
import android.util.AttributeSet;
import android.view.InputQueue;
-import android.view.KeyEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.View;
-import android.view.WindowManager;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import java.io.File;
@@ -176,8 +175,8 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback2,
? savedInstanceState.getByteArray(KEY_NATIVE_SAVED_STATE) : null;
mNativeHandle = loadNativeCode(path, funcname, Looper.myQueue(),
- getFilesDir().toString(), getObbDir().toString(),
- Environment.getExternalStorageAppFilesDirectory(ai.packageName).toString(),
+ getFilesDir().getAbsolutePath(), getObbDir().getAbsolutePath(),
+ getExternalFilesDir(null).getAbsolutePath(),
Build.VERSION.SDK_INT, getAssets(), nativeSavedState);
if (mNativeHandle == 0) {