diff options
author | Ivan Chiang <chiangi@google.com> | 2019-08-21 16:12:54 +0800 |
---|---|---|
committer | Ivan Chiang <chiangi@google.com> | 2019-10-02 06:01:36 +0000 |
commit | 730b3a3a452afb9be38bbef9f7ba36bdbd392b89 (patch) | |
tree | e3f1bbea42c7b03ecdf020eae2ecdc1406037790 /packages/ExternalStorageProvider/src | |
parent | 92818ea47c11c63d2b92f44acddcf603f65aebc0 (diff) |
Allow providers block folders in ACTION_OPEN_DOCUMENT_TREE
DocumentsContract
- Add new flag FLAG_DIR_BLOCKS_TREE in Document
ExternalStorageProvider
- Add flag into DocumentInfo for blocking folder
Change-Id: Ib557fe99d330788a3bd968bffd43b6658761514f
Bug: 32370759
Test: atest DocumentsTest
Diffstat (limited to 'packages/ExternalStorageProvider/src')
-rw-r--r-- | packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 1b27b52f1fa1..48d34ae7ba47 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -16,6 +16,7 @@ package com.android.externalstorage; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.usage.StorageStatsManager; import android.content.ContentResolver; @@ -298,6 +299,53 @@ public class ExternalStorageProvider extends FileSystemProvider { return projection != null ? projection : DEFAULT_ROOT_PROJECTION; } + /** + * Check that the directory is the root of storage or blocked file from tree. + * + * @param docId the docId of the directory to be checked + * @return true, should be blocked from tree. Otherwise, false. + */ + @Override + protected boolean shouldBlockFromTree(@NonNull String docId) { + try { + final File dir = getFileForDocId(docId, true /* visible */).getCanonicalFile(); + if (!dir.isDirectory()) { + return false; + } + + final String path = dir.getAbsolutePath(); + + // Block Download folder from tree + if (MediaStore.Downloads.isDownloadDir(path)) { + return true; + } + + final ArrayMap<String, RootInfo> roots = new ArrayMap<>(); + + synchronized (mRootsLock) { + roots.putAll(mRoots); + } + + // block root of storage + for (int i = 0; i < roots.size(); i++) { + RootInfo rootInfo = roots.valueAt(i); + // skip home root + if (TextUtils.equals(rootInfo.rootId, ROOT_ID_HOME)) { + continue; + } + + // block the root of storage + if (TextUtils.equals(path, rootInfo.visiblePath.getAbsolutePath())) { + return true; + } + } + return false; + } catch (IOException e) { + throw new IllegalArgumentException( + "Failed to determine if " + docId + " should block from tree " + ": " + e); + } + } + @Override protected String getDocIdForFile(File file) throws FileNotFoundException { return getDocIdForFileMaybeCreate(file, false); |