diff options
author | 2017-05-26 14:22:58 -0700 | |
---|---|---|
committer | 2017-05-31 15:29:08 -0700 | |
commit | 7f7ee10edaac1214e23f267a595014b510562d1e (patch) | |
tree | be8bc6ebbc93f54cdf7468df2442348c8ffc5c09 | |
parent | f625007a9a15ea5b130d8cf888b6690112e0d5ca (diff) |
Passing SelectionDetails to DragAndDropManager.
Bug: 37567847
Change-Id: I793866dd39ec2f1ce772c45ef658d5b46efbf04d
9 files changed, 79 insertions, 13 deletions
diff --git a/src/com/android/documentsui/DragAndDropManager.java b/src/com/android/documentsui/DragAndDropManager.java index a6630fec3..a80b35b75 100644 --- a/src/com/android/documentsui/DragAndDropManager.java +++ b/src/com/android/documentsui/DragAndDropManager.java @@ -28,6 +28,7 @@ import android.view.DragEvent; import android.view.KeyEvent; import android.view.View; +import com.android.documentsui.MenuManager.SelectionDetails; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.RootInfo; @@ -78,6 +79,7 @@ public interface DragAndDropManager { List<DocumentInfo> srcs, RootInfo root, List<Uri> invalidDest, + SelectionDetails selectionDetails, IconHelper iconHelper, @Nullable DocumentInfo parent); @@ -226,22 +228,17 @@ public interface DragAndDropManager { List<DocumentInfo> srcs, RootInfo root, List<Uri> invalidDest, + SelectionDetails selectionDetails, IconHelper iconHelper, @Nullable DocumentInfo parent) { mView = v; mInvalidDest = invalidDest; - boolean containsFilesInArchive = false; + mMustBeCopied = !selectionDetails.canDelete(); List<Uri> uris = new ArrayList<>(srcs.size()); for (DocumentInfo doc : srcs) { uris.add(doc.derivedUri); - if (!doc.isRemoveSupported() - && !doc.isDeleteSupported() - && !doc.isMoveSupported()) { - mMustBeCopied = true; - } - containsFilesInArchive |= doc.isInArchive(); } mClipData = (parent == null) ? mClipper.getClipDataForDocuments(uris, FileOperationService.OPERATION_UNKNOWN) @@ -253,7 +250,7 @@ public interface DragAndDropManager { updateShadow(srcs, iconHelper); int flag = View.DRAG_FLAG_GLOBAL | View.DRAG_FLAG_OPAQUE; - if (!containsFilesInArchive) { + if (!selectionDetails.containsFilesInArchive()) { flag |= View.DRAG_FLAG_GLOBAL_URI_READ | View.DRAG_FLAG_GLOBAL_URI_WRITE; } diff --git a/src/com/android/documentsui/MenuManager.java b/src/com/android/documentsui/MenuManager.java index aa50ecea1..d00d14b34 100644 --- a/src/com/android/documentsui/MenuManager.java +++ b/src/com/android/documentsui/MenuManager.java @@ -318,6 +318,8 @@ public abstract class MenuManager { boolean containsPartialFiles(); + boolean containsFilesInArchive(); + // TODO: Update these to express characteristics instead of answering concrete questions, // since the answer to those questions is (or can be) activity specific. boolean canDelete(); diff --git a/src/com/android/documentsui/dirlist/DirectoryFragment.java b/src/com/android/documentsui/dirlist/DirectoryFragment.java index ff9edc2d2..4e97da7e5 100644 --- a/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -364,6 +364,7 @@ public class DirectoryFragment extends Fragment implements SwipeRefreshLayout.On mIconHelper, mModel, mSelectionMgr, + mSelectionMetadata, mState, this::getModelId, mRecView::findChildViewUnder, diff --git a/src/com/android/documentsui/dirlist/DragStartListener.java b/src/com/android/documentsui/dirlist/DragStartListener.java index 6c23e205c..1651603ac 100644 --- a/src/com/android/documentsui/dirlist/DragStartListener.java +++ b/src/com/android/documentsui/dirlist/DragStartListener.java @@ -24,6 +24,7 @@ import android.util.Log; import android.view.View; import com.android.documentsui.DragAndDropManager; +import com.android.documentsui.MenuManager.SelectionDetails; import com.android.documentsui.Model; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.Events; @@ -67,6 +68,7 @@ interface DragStartListener { private final IconHelper mIconHelper; private final State mState; private final SelectionManager mSelectionMgr; + private final SelectionDetails mSelectionDetails; private final ViewFinder mViewFinder; private final Function<View, String> mIdFinder; private final Function<Selection, List<DocumentInfo>> mDocsConverter; @@ -78,6 +80,7 @@ interface DragStartListener { IconHelper iconHelper, State state, SelectionManager selectionMgr, + SelectionDetails selectionDetails, ViewFinder viewFinder, Function<View, String> idFinder, Function<Selection, List<DocumentInfo>> docsConverter, @@ -86,6 +89,7 @@ interface DragStartListener { mIconHelper = iconHelper; mState = state; mSelectionMgr = selectionMgr; + mSelectionDetails = selectionDetails; mViewFinder = viewFinder; mIdFinder = idFinder; mDocsConverter = docsConverter; @@ -134,8 +138,8 @@ interface DragStartListener { invalidDest.add(parent.derivedUri); } - mDragAndDropManager.startDrag( - view, srcs, mState.stack.getRoot(), invalidDest, mIconHelper, parent); + mDragAndDropManager.startDrag(view, srcs, mState.stack.getRoot(), invalidDest, + mSelectionDetails, mIconHelper, parent); return true; } @@ -168,6 +172,7 @@ interface DragStartListener { IconHelper iconHelper, Model model, SelectionManager selectionMgr, + SelectionDetails selectionDetails, State state, Function<View, String> idFinder, ViewFinder viewFinder, @@ -177,6 +182,7 @@ interface DragStartListener { iconHelper, state, selectionMgr, + selectionDetails, viewFinder, idFinder, model::getDocuments, diff --git a/src/com/android/documentsui/selection/SelectionMetadata.java b/src/com/android/documentsui/selection/SelectionMetadata.java index 9285c3474..df0f1d601 100644 --- a/src/com/android/documentsui/selection/SelectionMetadata.java +++ b/src/com/android/documentsui/selection/SelectionMetadata.java @@ -40,6 +40,8 @@ public class SelectionMetadata implements MenuManager.SelectionDetails, SelectionManager.ItemCallback { private static final String TAG = "SelectionMetadata"; + private final static int FLAG_CAN_DELETE = + Document.FLAG_SUPPORTS_REMOVE | Document.FLAG_SUPPORTS_DELETE; private final Function<String, Cursor> mDocFinder; @@ -83,7 +85,7 @@ public class SelectionMetadata if ((docFlags & Document.FLAG_DIR_SUPPORTS_CREATE) != 0) { mWritableDirectoryCount += delta; } - if ((docFlags & Document.FLAG_SUPPORTS_DELETE) == 0) { + if ((docFlags & FLAG_CAN_DELETE) == 0) { mNoDeleteCount += delta; } if ((docFlags & Document.FLAG_SUPPORTS_RENAME) == 0) { @@ -133,6 +135,11 @@ public class SelectionMetadata } @Override + public boolean containsFilesInArchive() { + return mInArchiveCount > 0; + } + + @Override public boolean canDelete() { return size() > 0 && mNoDeleteCount == 0; } diff --git a/tests/common/com/android/documentsui/testing/TestDragAndDropManager.java b/tests/common/com/android/documentsui/testing/TestDragAndDropManager.java index 288552271..ddd5c1347 100644 --- a/tests/common/com/android/documentsui/testing/TestDragAndDropManager.java +++ b/tests/common/com/android/documentsui/testing/TestDragAndDropManager.java @@ -25,6 +25,8 @@ import android.view.View; import com.android.documentsui.ActionHandler; import com.android.documentsui.DragAndDropManager; +import com.android.documentsui.MenuManager; +import com.android.documentsui.MenuManager.SelectionDetails; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.DocumentStack; import com.android.documentsui.base.RootInfo; @@ -45,8 +47,8 @@ public class TestDragAndDropManager implements DragAndDropManager { public void onKeyEvent(KeyEvent event) {} @Override - public void startDrag(View v, List<DocumentInfo> srcs, RootInfo root, - List<Uri> invalidDest, IconHelper iconHelper, @Nullable DocumentInfo parent) { + public void startDrag(View v, List<DocumentInfo> srcs, RootInfo root, List<Uri> invalidDest, + SelectionDetails details, IconHelper iconHelper, @Nullable DocumentInfo parent) { startDragHandler.accept(srcs); } diff --git a/tests/common/com/android/documentsui/testing/TestSelectionDetails.java b/tests/common/com/android/documentsui/testing/TestSelectionDetails.java index cfecb1d88..c63fdee59 100644 --- a/tests/common/com/android/documentsui/testing/TestSelectionDetails.java +++ b/tests/common/com/android/documentsui/testing/TestSelectionDetails.java @@ -27,6 +27,7 @@ public class TestSelectionDetails implements SelectionDetails { public boolean canRename; public boolean canDelete; public boolean containPartial; + public boolean containsFilesInArchive; public boolean containDirectories; public boolean containFiles; public boolean canPasteInto; @@ -50,6 +51,11 @@ public class TestSelectionDetails implements SelectionDetails { } @Override + public boolean containsFilesInArchive() { + return containsFilesInArchive; + } + + @Override public boolean canRename() { return canRename; } diff --git a/tests/unit/com/android/documentsui/DragAndDropManagerTests.java b/tests/unit/com/android/documentsui/DragAndDropManagerTests.java index a9f49ecca..deea97137 100644 --- a/tests/unit/com/android/documentsui/DragAndDropManagerTests.java +++ b/tests/unit/com/android/documentsui/DragAndDropManagerTests.java @@ -47,6 +47,7 @@ import com.android.documentsui.testing.TestEnv; import com.android.documentsui.testing.TestEventListener; import com.android.documentsui.testing.TestIconHelper; import com.android.documentsui.testing.TestProvidersAccess; +import com.android.documentsui.testing.TestSelectionDetails; import com.android.documentsui.testing.Views; import org.junit.Before; @@ -70,6 +71,7 @@ public class DragAndDropManagerTests { private TestActionHandler mActions; private TestDocumentClipper mClipper; + private TestSelectionDetails mDetails; private ClipData mClipData; private TestIconHelper mIconHelper; @@ -104,6 +106,8 @@ public class DragAndDropManagerTests { mActions = new TestActionHandler(mEnv); mClipper = new TestDocumentClipper(); + mDetails = new TestSelectionDetails(); + mDetails.canDelete = true; ClipDescription description = new ClipDescription("", new String[]{}); description.setExtras(new PersistableBundle()); mClipData = ClipDatas.createTestClipData(description); @@ -148,6 +152,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -162,6 +167,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, null); @@ -175,6 +181,7 @@ public class DragAndDropManagerTests { Arrays.asList(TestEnv.FILE_APK), TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -190,6 +197,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -206,6 +214,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FOLDER_1.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -214,11 +223,13 @@ public class DragAndDropManagerTests { @Test public void testInArchiveUris_HasCorrectFlagPermission() { + mDetails.containsFilesInArchive = true; mManager.startDrag( mStartDragView, Arrays.asList(TestEnv.FILE_IN_ARCHIVE), TestProvidersAccess.HOME, Arrays.asList(TestEnv.FILE_ARCHIVE.derivedUri, TestEnv.FILE_IN_ARCHIVE.derivedUri), + mDetails, mIconHelper, TestEnv.FILE_ARCHIVE); @@ -233,6 +244,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FOLDER_1.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -247,6 +259,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FOLDER_1.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -261,6 +274,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FOLDER_1.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -275,6 +289,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -291,6 +306,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -309,6 +325,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -327,6 +344,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.DOWNLOADS, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -345,6 +363,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -363,6 +382,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.DOWNLOADS, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -384,6 +404,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.DOWNLOADS, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -405,6 +426,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -426,6 +448,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -447,6 +470,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.DOWNLOADS, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -471,6 +495,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.DOWNLOADS, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -495,6 +520,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -519,6 +545,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -543,6 +570,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -561,6 +589,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -582,6 +611,7 @@ public class DragAndDropManagerTests { root, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -598,6 +628,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -620,6 +651,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -645,6 +677,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.DOWNLOADS, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -671,6 +704,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.DOWNLOADS, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -700,6 +734,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -718,6 +753,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.HOME, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -739,6 +775,7 @@ public class DragAndDropManagerTests { TestProvidersAccess.DOWNLOADS, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, TestEnv.FILE_JPG.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); @@ -754,11 +791,13 @@ public class DragAndDropManagerTests { @Test public void testDrop_Copies_SameRoot_ReadOnlyFile_DropOnDocument() { + mDetails.canDelete = false; mManager.startDrag( mStartDragView, Arrays.asList(TestEnv.FILE_READ_ONLY), TestProvidersAccess.DOWNLOADS, Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_READ_ONLY.derivedUri), + mDetails, mIconHelper, TestEnv.FOLDER_0); diff --git a/tests/unit/com/android/documentsui/dirlist/DragStartListenerTest.java b/tests/unit/com/android/documentsui/dirlist/DragStartListenerTest.java index 699c44755..635e249d5 100644 --- a/tests/unit/com/android/documentsui/dirlist/DragStartListenerTest.java +++ b/tests/unit/com/android/documentsui/dirlist/DragStartListenerTest.java @@ -26,6 +26,8 @@ import android.support.test.runner.AndroidJUnit4; import android.view.MotionEvent; import android.view.View; +import com.android.documentsui.MenuManager; +import com.android.documentsui.MenuManager.SelectionDetails; import com.android.documentsui.base.DocumentInfo; import com.android.documentsui.base.Providers; import com.android.documentsui.base.State; @@ -36,6 +38,7 @@ import com.android.documentsui.selection.Selection; import com.android.documentsui.testing.TestDragAndDropManager; import com.android.documentsui.testing.TestEvent; import com.android.documentsui.testing.SelectionManagers; +import com.android.documentsui.testing.TestSelectionDetails; import com.android.documentsui.testing.Views; import org.junit.Before; @@ -51,6 +54,7 @@ public class DragStartListenerTest { private ActiveListener mListener; private TestEvent.Builder mEvent; private SelectionManager mMultiSelectManager; + private SelectionDetails mSelectionDetails; private String mViewModelId; private TestDragAndDropManager mManager; @@ -58,6 +62,7 @@ public class DragStartListenerTest { public void setUp() throws Exception { mMultiSelectManager = SelectionManagers.createTestInstance(); mManager = new TestDragAndDropManager(); + mSelectionDetails = new TestSelectionDetails(); DocumentInfo doc = new DocumentInfo(); doc.authority = Providers.AUTHORITY_STORAGE; @@ -70,6 +75,7 @@ public class DragStartListenerTest { null, // icon helper state, mMultiSelectManager, + mSelectionDetails, // view finder (float x, float y) -> { return Views.createTestView(x, y); |