summaryrefslogtreecommitdiffstats
path: root/src/com/android/providers
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2015-08-14 14:42:56 -0700
committerJeff Sharkey <jsharkey@android.com>2015-08-14 14:43:05 -0700
commitcba15caa4ee3f5948140d6fde91518f3f263f5b4 (patch)
tree987377eef2289fddd314e71487f848bc3e89c967 /src/com/android/providers
parentf94b8b8a31ed2eee8350728abadee567c44ea58c (diff)
downloadandroid_packages_providers_MediaProvider-cba15caa4ee3f5948140d6fde91518f3f263f5b4.tar.gz
android_packages_providers_MediaProvider-cba15caa4ee3f5948140d6fde91518f3f263f5b4.tar.bz2
android_packages_providers_MediaProvider-cba15caa4ee3f5948140d6fde91518f3f263f5b4.zip
Update primary storage paths when volumes change.
Devices that use physical media as their primary storage may not have that storage mounted by the time that MediaProvider is started, which means we'd snapshot a stale primary storage path. To fix this, refresh those paths as volumes are mounted or unmounted over time. Also fix logic that detects secondary storage devices. Bug: 22629557 Change-Id: I3c6b057ce082318e1b28e261c953a436da42e36f
Diffstat (limited to 'src/com/android/providers')
-rwxr-xr-xsrc/com/android/providers/media/MediaProvider.java26
1 files changed, 14 insertions, 12 deletions
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index 0bbba768..271aa807 100755
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -128,19 +128,21 @@ public class MediaProvider extends ContentProvider {
private static final HashMap<String, String> sFolderArtMap = new HashMap<String, String>();
/** Resolved canonical path to external storage. */
- private static final String sExternalPath;
+ private String mExternalPath;
/** Resolved canonical path to cache storage. */
- private static final String sCachePath;
+ private String mCachePath;
/** Resolved canonical path to legacy storage. */
- private static final String sLegacyPath;
+ private String mLegacyPath;
+
+ private void updateStoragePaths() {
+ mExternalStoragePaths = mStorageManager.getVolumePaths();
- static {
try {
- sExternalPath =
+ mExternalPath =
Environment.getExternalStorageDirectory().getCanonicalPath() + File.separator;
- sCachePath =
+ mCachePath =
Environment.getDownloadCacheDirectory().getCanonicalPath() + File.separator;
- sLegacyPath =
+ mLegacyPath =
Environment.getLegacyExternalStorageDirectory().getCanonicalPath()
+ File.separator;
} catch (IOException e) {
@@ -4695,7 +4697,7 @@ public class MediaProvider extends ContentProvider {
== PackageManager.PERMISSION_GRANTED);
}
- if (path.startsWith(sExternalPath) || path.startsWith(sLegacyPath)) {
+ if (path.startsWith(mExternalPath) || path.startsWith(mLegacyPath)) {
if (isWrite) {
if (!writeGranted) {
enforceCallingOrSelfPermissionAndAppOps(
@@ -4705,7 +4707,7 @@ public class MediaProvider extends ContentProvider {
enforceCallingOrSelfPermissionAndAppOps(
READ_EXTERNAL_STORAGE, "External path: " + path);
}
- } else if (path.startsWith(sCachePath)) {
+ } else if (path.startsWith(mCachePath)) {
if ((isWrite && !writeGranted) || !readGranted) {
c.enforceCallingOrSelfPermission(ACCESS_CACHE_FILESYSTEM, "Cache path: " + path);
}
@@ -4734,7 +4736,7 @@ public class MediaProvider extends ContentProvider {
}
private boolean isSecondaryExternalPath(String path) {
- for (int i = mExternalStoragePaths.length - 1; i >= 0; --i) {
+ for (int i = 1; i < mExternalStoragePaths.length; i++) {
if (path.startsWith(mExternalStoragePaths[i])) {
return true;
}
@@ -5334,7 +5336,7 @@ public class MediaProvider extends ContentProvider {
}
// Update paths to reflect currently mounted volumes
- mExternalStoragePaths = mStorageManager.getVolumePaths();
+ updateStoragePaths();
synchronized (mDatabases) {
if (mDatabases.get(volume) != null) { // Already attached
@@ -5477,7 +5479,7 @@ public class MediaProvider extends ContentProvider {
}
// Update paths to reflect currently mounted volumes
- mExternalStoragePaths = mStorageManager.getVolumePaths();
+ updateStoragePaths();
String volume = uri.getPathSegments().get(0);
if (INTERNAL_VOLUME.equals(volume)) {