diff options
author | 2017-05-19 15:11:28 -0700 | |
---|---|---|
committer | 2017-05-22 18:05:08 -0700 | |
commit | c0b6b3f1f43f9464156c6e4f974c416d8dbfe3c2 (patch) | |
tree | bcf672d5269d5edd8bf8695a55f0d8484729cf96 | |
parent | b18a526eb3305dd5976e3563f8af31da53cb8cc9 (diff) |
Remove URI_READ/URI_WRITE permissions when dragging files in archives.
Test: Tested manually. Dropping to Gmail does not work, but dropping to
another Files app window still works.
Bug: 37261169
Change-Id: Ie4a6cfd1b4573aee1f332b1782f57518617d79d6
-rw-r--r-- | src/com/android/documentsui/DragAndDropManager.java | 12 | ||||
-rw-r--r-- | tests/unit/com/android/documentsui/DragAndDropManagerTests.java | 16 |
2 files changed, 24 insertions, 4 deletions
diff --git a/src/com/android/documentsui/DragAndDropManager.java b/src/com/android/documentsui/DragAndDropManager.java index 5d7756f3f..a6630fec3 100644 --- a/src/com/android/documentsui/DragAndDropManager.java +++ b/src/com/android/documentsui/DragAndDropManager.java @@ -231,6 +231,7 @@ public interface DragAndDropManager { mView = v; mInvalidDest = invalidDest; + boolean containsFilesInArchive = false; List<Uri> uris = new ArrayList<>(srcs.size()); for (DocumentInfo doc : srcs) { @@ -240,6 +241,7 @@ public interface DragAndDropManager { && !doc.isMoveSupported()) { mMustBeCopied = true; } + containsFilesInArchive |= doc.isInArchive(); } mClipData = (parent == null) ? mClipper.getClipDataForDocuments(uris, FileOperationService.OPERATION_UNKNOWN) @@ -250,15 +252,17 @@ public interface DragAndDropManager { updateShadow(srcs, iconHelper); + int flag = View.DRAG_FLAG_GLOBAL | View.DRAG_FLAG_OPAQUE; + if (!containsFilesInArchive) { + flag |= View.DRAG_FLAG_GLOBAL_URI_READ + | View.DRAG_FLAG_GLOBAL_URI_WRITE; + } startDragAndDrop( v, mClipData, mShadowBuilder, this, // Used to detect multi-window drag and drop - View.DRAG_FLAG_GLOBAL - | View.DRAG_FLAG_OPAQUE - | View.DRAG_FLAG_GLOBAL_URI_READ - | View.DRAG_FLAG_GLOBAL_URI_WRITE); + flag); } private void updateShadow(List<DocumentInfo> srcs, IconHelper iconHelper) { diff --git a/tests/unit/com/android/documentsui/DragAndDropManagerTests.java b/tests/unit/com/android/documentsui/DragAndDropManagerTests.java index d1b5a411d..a9f49ecca 100644 --- a/tests/unit/com/android/documentsui/DragAndDropManagerTests.java +++ b/tests/unit/com/android/documentsui/DragAndDropManagerTests.java @@ -77,6 +77,7 @@ public class DragAndDropManagerTests { private TestEventListener<ClipData> mStartDragListener; private TestEventListener<Void> mShadowUpdateListener; + private TestEventListener<Integer> mFlagListener; private TestEventListener<Integer> mCallbackListener; private FileOperations.Callback mCallback = new FileOperations.Callback() { @@ -115,6 +116,7 @@ public class DragAndDropManagerTests { mStartDragListener = new TestEventListener<>(); mShadowUpdateListener = new TestEventListener<>(); mCallbackListener = new TestEventListener<>(); + mFlagListener = new TestEventListener<>(); mManager = new RuntimeDragAndDropManager(mActivity, mClipper, mShadowBuilder, mDefaultIcon) { @@ -125,6 +127,7 @@ public class DragAndDropManagerTests { assertSame(mShadowBuilder, builder); assertNotNull(localState); + mFlagListener.accept(flag); mStartDragListener.accept(clipData); } @@ -210,6 +213,19 @@ public class DragAndDropManagerTests { } @Test + public void testInArchiveUris_HasCorrectFlagPermission() { + mManager.startDrag( + mStartDragView, + Arrays.asList(TestEnv.FILE_IN_ARCHIVE), + TestProvidersAccess.HOME, + Arrays.asList(TestEnv.FILE_ARCHIVE.derivedUri, TestEnv.FILE_IN_ARCHIVE.derivedUri), + mIconHelper, + TestEnv.FILE_ARCHIVE); + + mFlagListener.assertLastArgument(View.DRAG_FLAG_GLOBAL | View.DRAG_FLAG_OPAQUE); + } + + @Test public void testCanSpringOpen_ReturnsFalse_DocIsInvalidDestination() { mManager.startDrag( mStartDragView, |