diff options
| -rw-r--r-- | core/java/com/android/internal/content/FileSystemProvider.java | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/core/java/com/android/internal/content/FileSystemProvider.java b/core/java/com/android/internal/content/FileSystemProvider.java index dec9ae701fb2..221cd6d8a5c3 100644 --- a/core/java/com/android/internal/content/FileSystemProvider.java +++ b/core/java/com/android/internal/content/FileSystemProvider.java @@ -66,6 +66,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.regex.Pattern; /** * A helper class for {@link android.provider.DocumentsProvider} to perform file operations on local @@ -388,7 +389,9 @@ public abstract class FileSystemProvider extends DocumentsProvider { resolveProjection(projection), parentDocumentId, parent); if (parent.isDirectory()) { for (File file : FileUtils.listFilesOrEmpty(parent)) { - includeFile(result, null, file); + if (!shouldHide(file)) { + includeFile(result, null, file); + } } } else { Log.w(TAG, "parentDocumentId '" + parentDocumentId + "' is not Directory"); @@ -422,6 +425,8 @@ public abstract class FileSystemProvider extends DocumentsProvider { pending.add(folder); while (!pending.isEmpty() && result.getCount() < 24) { final File file = pending.removeFirst(); + if (shouldHide(file)) continue; + if (file.isDirectory()) { for (File child : file.listFiles()) { pending.add(child); @@ -540,6 +545,7 @@ public abstract class FileSystemProvider extends DocumentsProvider { } else { file = getFileForDocId(docId); } + final String mimeType = getDocumentType(docId, file); row.add(Document.COLUMN_DOCUMENT_ID, docId); row.add(Document.COLUMN_MIME_TYPE, mimeType); @@ -598,6 +604,17 @@ public abstract class FileSystemProvider extends DocumentsProvider { return row; } + private static final Pattern PATTERN_HIDDEN_PATH = Pattern.compile( + "(?i)^/storage/[^/]+/(?:[0-9]+/)?Android/(?:data|obb|sandbox)$"); + + /** + * In a scoped storage world, access to "Android/data" style directories are + * hidden for privacy reasons. + */ + protected boolean shouldHide(@NonNull File file) { + return (PATTERN_HIDDEN_PATH.matcher(file.getAbsolutePath()).matches()); + } + protected boolean shouldBlockFromTree(@NonNull String docId) { return false; } |