summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ben Lin <linben@google.com> 2017-05-19 15:11:28 -0700
committer Ben Lin <linben@google.com> 2017-05-22 18:05:08 -0700
commitc0b6b3f1f43f9464156c6e4f974c416d8dbfe3c2 (patch)
treebcf672d5269d5edd8bf8695a55f0d8484729cf96
parentb18a526eb3305dd5976e3563f8af31da53cb8cc9 (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.java12
-rw-r--r--tests/unit/com/android/documentsui/DragAndDropManagerTests.java16
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,