From d8dc4bcdcc66748c9fff8b496dacdfa35fc9062a Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 8 Feb 2019 14:03:35 -0700 Subject: [PATCH 1/2] Use newly defined columns for directory names. Instead of using Uri query parameters to configure directory names, this moves to using real columns that we recently added. Bug: 123967243, 115377970 Test: atest MediaProviderTests Test: atest cts/tests/tests/provider/src/android/provider/cts/MediaStore* Change-Id: I8aa2c65a7b3552cd1ef0b6371dfd52c0798db218 --- core/java/android/provider/MediaStore.java | 29 ++++++++-------------- 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index edaf7bb055cf8..2a04dfcf95924 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -156,10 +156,6 @@ public final class MediaStore { */ public static final String PARAM_DELETE_DATA = "deletedata"; - /** {@hide} */ - public static final String PARAM_PRIMARY = "primary"; - /** {@hide} */ - public static final String PARAM_SECONDARY = "secondary"; /** {@hide} */ public static final String PARAM_INCLUDE_PENDING = "includePending"; /** {@hide} */ @@ -582,14 +578,7 @@ public final class MediaStore { */ public static @NonNull Uri createPending(@NonNull Context context, @NonNull PendingParams params) { - final Uri.Builder builder = params.insertUri.buildUpon(); - if (!TextUtils.isEmpty(params.primaryDirectory)) { - builder.appendQueryParameter(PARAM_PRIMARY, params.primaryDirectory); - } - if (!TextUtils.isEmpty(params.secondaryDirectory)) { - builder.appendQueryParameter(PARAM_SECONDARY, params.secondaryDirectory); - } - return context.getContentResolver().insert(builder.build(), params.insertValues); + return context.getContentResolver().insert(params.insertUri, params.insertValues); } /** @@ -612,10 +601,6 @@ public final class MediaStore { public final Uri insertUri; /** {@hide} */ public final ContentValues insertValues; - /** {@hide} */ - public String primaryDirectory; - /** {@hide} */ - public String secondaryDirectory; /** * Create parameters that describe a pending media item. @@ -657,7 +642,11 @@ public final class MediaStore { * @see MediaColumns#PRIMARY_DIRECTORY */ public void setPrimaryDirectory(@Nullable String primaryDirectory) { - this.primaryDirectory = primaryDirectory; + if (primaryDirectory == null) { + this.insertValues.remove(MediaColumns.PRIMARY_DIRECTORY); + } else { + this.insertValues.put(MediaColumns.PRIMARY_DIRECTORY, primaryDirectory); + } } /** @@ -670,7 +659,11 @@ public final class MediaStore { * @see MediaColumns#SECONDARY_DIRECTORY */ public void setSecondaryDirectory(@Nullable String secondaryDirectory) { - this.secondaryDirectory = secondaryDirectory; + if (secondaryDirectory == null) { + this.insertValues.remove(MediaColumns.SECONDARY_DIRECTORY); + } else { + this.insertValues.put(MediaColumns.SECONDARY_DIRECTORY, secondaryDirectory); + } } /** From 858b311cee8a54ea5243a3cbb946601ff5c7dba6 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 8 Feb 2019 14:38:59 -0700 Subject: [PATCH 2/2] Resolve symlinks when listing scan paths. Some paths like /product might be symlinks to /system/product. Bug: 124070462, 124074176, 124074218, 124074430 Test: atest CtsMediaTestCases Change-Id: Ic0aa388f385d13a124ae170686dea18e716016e0 --- core/java/android/provider/MediaStore.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index 2a04dfcf95924..0b3842080a75a 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -3166,20 +3166,29 @@ public final class MediaStore { final ArrayList res = new ArrayList<>(); if (VOLUME_INTERNAL.equals(volumeName)) { - res.add(new File(Environment.getRootDirectory(), "media")); - res.add(new File(Environment.getOemDirectory(), "media")); - res.add(new File(Environment.getProductDirectory(), "media")); + addCanoncialFile(res, new File(Environment.getRootDirectory(), "media")); + addCanoncialFile(res, new File(Environment.getOemDirectory(), "media")); + addCanoncialFile(res, new File(Environment.getProductDirectory(), "media")); } else { - res.add(getVolumePath(volumeName)); + addCanoncialFile(res, getVolumePath(volumeName)); final UserManager um = AppGlobals.getInitialApplication() .getSystemService(UserManager.class); if (VOLUME_EXTERNAL.equals(volumeName) && um.isDemoUser()) { - res.add(Environment.getDataPreloadsMediaDirectory()); + addCanoncialFile(res, Environment.getDataPreloadsMediaDirectory()); } } return res; } + private static void addCanoncialFile(List list, File file) { + try { + list.add(file.getCanonicalFile()); + } catch (IOException e) { + Log.w(TAG, "Failed to resolve " + file + ": " + e); + list.add(file); + } + } + /** * Uri for querying the state of the media scanner. */