| /* | |
| * Copyright (C) 2017 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| package com.android.documentsui; | |
| import static junit.framework.Assert.assertEquals; | |
| import static junit.framework.Assert.assertFalse; | |
| import static junit.framework.Assert.assertNotNull; | |
| import static junit.framework.Assert.assertSame; | |
| import static junit.framework.Assert.assertTrue; | |
| import android.content.ClipData; | |
| import android.content.ClipDescription; | |
| import android.graphics.drawable.Drawable; | |
| import android.os.PersistableBundle; | |
| import android.util.Pair; | |
| import android.view.KeyEvent; | |
| import android.view.View; | |
| import androidx.test.filters.SmallTest; | |
| import androidx.test.runner.AndroidJUnit4; | |
| import com.android.documentsui.DragAndDropManager.RuntimeDragAndDropManager; | |
| import com.android.documentsui.DragAndDropManager.State; | |
| import com.android.documentsui.base.DocumentStack; | |
| import com.android.documentsui.base.RootInfo; | |
| import com.android.documentsui.services.FileOperationService; | |
| import com.android.documentsui.services.FileOperations; | |
| import com.android.documentsui.testing.ClipDatas; | |
| import com.android.documentsui.testing.KeyEvents; | |
| import com.android.documentsui.testing.TestActionHandler; | |
| import com.android.documentsui.testing.TestDocumentClipper; | |
| import com.android.documentsui.testing.TestDrawable; | |
| 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; | |
| import org.junit.Test; | |
| import org.junit.runner.RunWith; | |
| import org.mockito.Mockito; | |
| import java.util.Arrays; | |
| @RunWith(AndroidJUnit4.class) | |
| @SmallTest | |
| public class DragAndDropManagerTests { | |
| private static final String PLURAL_FORMAT = "%1$d items"; | |
| private TestEnv mEnv; | |
| private TestActivity mActivity; | |
| private TestDragShadowBuilder mShadowBuilder; | |
| private View mStartDragView; | |
| private View mUpdateShadowView; | |
| private TestActionHandler mActions; | |
| private TestDocumentClipper mClipper; | |
| private TestSelectionDetails mDetails; | |
| private ClipData mClipData; | |
| private TestIconHelper mIconHelper; | |
| private Drawable mDefaultIcon; | |
| private TestEventListener<ClipData> mStartDragListener; | |
| private TestEventListener<Void> mShadowUpdateListener; | |
| private TestEventListener<Integer> mFlagListener; | |
| private TestEventListener<Integer> mCallbackListener; | |
| private FileOperations.Callback mCallback = new FileOperations.Callback() { | |
| @Override | |
| public void onOperationResult(@Status int status, | |
| @FileOperationService.OpType int opType, int docCount) { | |
| mCallbackListener.accept(status); | |
| } | |
| }; | |
| private DragAndDropManager mManager; | |
| @Before | |
| public void setUp() { | |
| mEnv = TestEnv.create(); | |
| mActivity = TestActivity.create(mEnv); | |
| mActivity.resources.plurals.put(R.plurals.elements_dragged, PLURAL_FORMAT); | |
| mShadowBuilder = TestDragShadowBuilder.create(); | |
| mStartDragView = Views.createTestView(); | |
| mUpdateShadowView = Views.createTestView(); | |
| 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); | |
| mClipper.nextClip = mClipData; | |
| mDefaultIcon = new TestDrawable(); | |
| mIconHelper = TestIconHelper.create(); | |
| mIconHelper.nextDocumentIcon = new TestDrawable(); | |
| mStartDragListener = new TestEventListener<>(); | |
| mShadowUpdateListener = new TestEventListener<>(); | |
| mCallbackListener = new TestEventListener<>(); | |
| mFlagListener = new TestEventListener<>(); | |
| mManager = new RuntimeDragAndDropManager(mActivity, mClipper, mShadowBuilder, | |
| mDefaultIcon) { | |
| @Override | |
| void startDragAndDrop(View v, ClipData clipData, DragShadowBuilder builder, | |
| Object localState, int flag) { | |
| assertSame(mStartDragView, v); | |
| assertSame(mShadowBuilder, builder); | |
| assertNotNull(localState); | |
| mFlagListener.accept(flag); | |
| mStartDragListener.accept(clipData); | |
| } | |
| @Override | |
| void updateDragShadow(View v) { | |
| assertSame(mUpdateShadowView, v); | |
| mShadowUpdateListener.accept(null); | |
| } | |
| }; | |
| } | |
| @Test | |
| public void testStartDrag_SetsCorrectClipData() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mStartDragListener.assertLastArgument(mClipper.nextClip); | |
| } | |
| @Test | |
| public void testStartDrag_SetsCorrectClipData_NullParent() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| null); | |
| mStartDragListener.assertLastArgument(mClipper.nextClip); | |
| } | |
| @Test | |
| public void testStartDrag_BuildsCorrectShadow_SingleDoc() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mShadowBuilder.title.assertLastArgument(TestEnv.FILE_APK.displayName); | |
| mShadowBuilder.icon.assertLastArgument(mIconHelper.nextDocumentIcon); | |
| } | |
| @Test | |
| public void testStartDrag_BuildsCorrectShadow_MultipleDocs() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mShadowBuilder.title.assertLastArgument(mActivity.getResources().getQuantityString( | |
| R.plurals.elements_dragged, 2, 2)); | |
| mShadowBuilder.icon.assertLastArgument(mDefaultIcon); | |
| } | |
| @Test | |
| public void testCanSpringOpen_ReturnsFalse_RootNotSupportCreate() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FOLDER_1, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FOLDER_1.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| assertFalse(mManager.canSpringOpen(TestProvidersAccess.HAMMY, TestEnv.FOLDER_2)); | |
| } | |
| @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); | |
| mFlagListener.assertLastArgument(View.DRAG_FLAG_GLOBAL | View.DRAG_FLAG_OPAQUE); | |
| } | |
| @Test | |
| public void testCanSpringOpen_ReturnsFalse_DocIsInvalidDestination() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FOLDER_1, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FOLDER_1.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| assertFalse(mManager.canSpringOpen(TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1)); | |
| } | |
| @Test | |
| public void testCanSpringOpen() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FOLDER_1, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FOLDER_1.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| assertTrue(mManager.canSpringOpen(TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_2)); | |
| } | |
| @Test | |
| public void testDefaultToUnknownState() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FOLDER_1, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FOLDER_1.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mShadowBuilder.state.assertLastArgument(DragAndDropManager.STATE_UNKNOWN); | |
| } | |
| @Test | |
| public void testUpdateStateToNotAllowed() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mManager.updateStateToNotAllowed(mUpdateShadowView); | |
| assertStateUpdated(DragAndDropManager.STATE_NOT_ALLOWED); | |
| } | |
| @Test | |
| public void testUpdateState_UpdatesToNotAllowed_RootNotSupportCreate() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| final @State int state = mManager.updateState( | |
| mUpdateShadowView, TestProvidersAccess.HAMMY, TestEnv.FOLDER_2); | |
| assertEquals(DragAndDropManager.STATE_NOT_ALLOWED, state); | |
| assertStateUpdated(DragAndDropManager.STATE_NOT_ALLOWED); | |
| } | |
| @Test | |
| public void testUpdateState_UpdatesToUnknown_RootDocIsNull() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| final @State int state = mManager.updateState( | |
| mUpdateShadowView, TestProvidersAccess.DOWNLOADS, null); | |
| assertEquals(DragAndDropManager.STATE_UNKNOWN, state); | |
| assertStateUpdated(DragAndDropManager.STATE_UNKNOWN); | |
| } | |
| @Test | |
| public void testUpdateState_UpdatesToMove_SameRoot() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.DOWNLOADS, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| final @State int state = mManager.updateState( | |
| mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| assertEquals(DragAndDropManager.STATE_MOVE, state); | |
| assertStateUpdated(DragAndDropManager.STATE_MOVE); | |
| } | |
| @Test | |
| public void testUpdateState_UpdatesToCopy_DifferentRoot() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| final @State int state = mManager.updateState( | |
| mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| assertEquals(DragAndDropManager.STATE_COPY, state); | |
| assertStateUpdated(DragAndDropManager.STATE_COPY); | |
| } | |
| @Test | |
| public void testUpdateState_UpdatesToCopy_SameRoot_LeftCtrlPressed() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.DOWNLOADS, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| KeyEvent event = KeyEvents.createLeftCtrlKey(KeyEvent.ACTION_DOWN); | |
| mManager.onKeyEvent(event); | |
| final @State int state = mManager.updateState( | |
| mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| assertEquals(DragAndDropManager.STATE_COPY, state); | |
| assertStateUpdated(DragAndDropManager.STATE_COPY); | |
| } | |
| @Test | |
| public void testIsDragFromSameApp_afterStartDrag() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.DOWNLOADS, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| assertTrue(mManager.isDragFromSameApp()); | |
| } | |
| @Test | |
| public void testIsDragFromSameApp_beforeStartDrag() { | |
| assertFalse(mManager.isDragFromSameApp()); | |
| } | |
| @Test | |
| public void testIsDragFromSameApp_afterStartDrag_afterDragEnded() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.DOWNLOADS, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| assertTrue(mManager.isDragFromSameApp()); | |
| mManager.dragEnded(); | |
| assertFalse(mManager.isDragFromSameApp()); | |
| } | |
| @Test | |
| public void testUpdateState_UpdatesToCopy_SameRoot_RightCtrlPressed() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.DOWNLOADS, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| KeyEvent event = KeyEvents.createRightCtrlKey(KeyEvent.ACTION_DOWN); | |
| mManager.onKeyEvent(event); | |
| final @State int state = mManager.updateState( | |
| mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| assertEquals(DragAndDropManager.STATE_COPY, state); | |
| assertStateUpdated(DragAndDropManager.STATE_COPY); | |
| } | |
| @Test | |
| public void testUpdateState_UpdatesToMove_DifferentRoot_LeftCtrlPressed() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| KeyEvent event = KeyEvents.createLeftCtrlKey(KeyEvent.ACTION_DOWN); | |
| mManager.onKeyEvent(event); | |
| final @State int state = mManager.updateState( | |
| mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| assertEquals(DragAndDropManager.STATE_MOVE, state); | |
| assertStateUpdated(DragAndDropManager.STATE_MOVE); | |
| } | |
| @Test | |
| public void testUpdateState_UpdatesToMove_DifferentRoot_RightCtrlPressed() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| KeyEvent event = KeyEvents.createRightCtrlKey(KeyEvent.ACTION_DOWN); | |
| mManager.onKeyEvent(event); | |
| final @State int state = mManager.updateState( | |
| mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| assertEquals(DragAndDropManager.STATE_MOVE, state); | |
| assertStateUpdated(DragAndDropManager.STATE_MOVE); | |
| } | |
| @Test | |
| public void testUpdateState_UpdatesToMove_SameRoot_LeftCtrlReleased() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.DOWNLOADS, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| KeyEvent event = KeyEvents.createLeftCtrlKey(KeyEvent.ACTION_DOWN); | |
| mManager.onKeyEvent(event); | |
| event = KeyEvents.createLeftCtrlKey(KeyEvent.ACTION_UP); | |
| mManager.onKeyEvent(event); | |
| final @State int state = mManager.updateState( | |
| mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| assertEquals(DragAndDropManager.STATE_MOVE, state); | |
| assertStateUpdated(DragAndDropManager.STATE_MOVE); | |
| } | |
| @Test | |
| public void testUpdateState_UpdatesToMove_SameRoot_RightCtrlReleased() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.DOWNLOADS, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| KeyEvent event = KeyEvents.createRightCtrlKey(KeyEvent.ACTION_DOWN); | |
| mManager.onKeyEvent(event); | |
| event = KeyEvents.createRightCtrlKey(KeyEvent.ACTION_UP); | |
| mManager.onKeyEvent(event); | |
| final @State int state = mManager.updateState( | |
| mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| assertEquals(DragAndDropManager.STATE_MOVE, state); | |
| assertStateUpdated(DragAndDropManager.STATE_MOVE); | |
| } | |
| @Test | |
| public void testUpdateState_UpdatesToCopy_DifferentRoot_LeftCtrlReleased() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| KeyEvent event = KeyEvents.createLeftCtrlKey(KeyEvent.ACTION_DOWN); | |
| mManager.onKeyEvent(event); | |
| event = KeyEvents.createLeftCtrlKey(KeyEvent.ACTION_UP); | |
| mManager.onKeyEvent(event); | |
| final @State int state = mManager.updateState( | |
| mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| assertEquals(DragAndDropManager.STATE_COPY, state); | |
| assertStateUpdated(DragAndDropManager.STATE_COPY); | |
| } | |
| @Test | |
| public void testUpdateState_UpdatesToCopy_DifferentRoot_RightCtrlReleased() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| KeyEvent event = KeyEvents.createRightCtrlKey(KeyEvent.ACTION_DOWN); | |
| mManager.onKeyEvent(event); | |
| event = KeyEvents.createRightCtrlKey(KeyEvent.ACTION_UP); | |
| mManager.onKeyEvent(event); | |
| final @State int state = mManager.updateState( | |
| mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| assertEquals(DragAndDropManager.STATE_COPY, state); | |
| assertStateUpdated(DragAndDropManager.STATE_COPY); | |
| } | |
| @Test | |
| public void testResetState_UpdatesToUnknown() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mManager.updateStateToNotAllowed(mUpdateShadowView); | |
| mManager.resetState(mUpdateShadowView); | |
| assertStateUpdated(DragAndDropManager.STATE_UNKNOWN); | |
| } | |
| @Test | |
| public void testDrop_Rejects_RootNotSupportCreate_DropOnRoot() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mManager.updateState(mUpdateShadowView, TestProvidersAccess.HAMMY, TestEnv.FOLDER_1); | |
| assertFalse(mManager.drop( | |
| mClipData, mManager, TestProvidersAccess.HAMMY, mActions, mCallback)); | |
| } | |
| @Test | |
| public void testDrop_Rejects_InvalidRoot() { | |
| RootInfo root = new RootInfo(); | |
| root.authority = TestProvidersAccess.HOME.authority; | |
| root.documentId = TestEnv.FOLDER_0.documentId; | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| root, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mManager.updateState(mUpdateShadowView, TestProvidersAccess.HOME, TestEnv.FOLDER_0); | |
| assertFalse(mManager.drop(mClipData, mManager, root, mActions, mCallback)); | |
| } | |
| @Test | |
| public void testDrop_Fails_NotGetRootDoc() throws Exception { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mManager.updateState(mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| mManager.drop( | |
| mClipData, mManager, TestProvidersAccess.DOWNLOADS, mActions, mCallback); | |
| mEnv.beforeAsserts(); | |
| mCallbackListener.assertLastArgument(FileOperations.Callback.STATUS_FAILED); | |
| } | |
| @Test | |
| public void testDrop_Copies_DifferentRoot_DropOnRoot() throws Exception { | |
| mActions.nextRootDocument = TestEnv.FOLDER_1; | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mManager.updateState(mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| mManager.drop( | |
| mClipData, mManager, TestProvidersAccess.DOWNLOADS, mActions, mCallback); | |
| mEnv.beforeAsserts(); | |
| final DocumentStack expect = | |
| new DocumentStack(TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| mClipper.copyFromClip.assertLastArgument(Pair.create(expect, mClipData)); | |
| mClipper.opType.assertLastArgument(FileOperationService.OPERATION_COPY); | |
| } | |
| @Test | |
| public void testDrop_Moves_SameRoot_DropOnRoot() throws Exception { | |
| mActions.nextRootDocument = TestEnv.FOLDER_1; | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.DOWNLOADS, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mManager.updateState(mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| mManager.drop( | |
| mClipData, mManager, TestProvidersAccess.DOWNLOADS, mActions, mCallback); | |
| mEnv.beforeAsserts(); | |
| final DocumentStack expect = | |
| new DocumentStack(TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| mClipper.copyFromClip.assertLastArgument(Pair.create(expect, mClipData)); | |
| mClipper.opType.assertLastArgument(FileOperationService.OPERATION_MOVE); | |
| } | |
| @Test | |
| public void testDrop_Copies_SameRoot_DropOnRoot_ReleasesCtrlBeforeGettingRootDocument() | |
| throws Exception{ | |
| mActions.nextRootDocument = TestEnv.FOLDER_1; | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.DOWNLOADS, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| KeyEvent event = KeyEvents.createLeftCtrlKey(KeyEvent.ACTION_DOWN); | |
| mManager.onKeyEvent(event); | |
| mManager.updateState(mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| mManager.drop( | |
| mClipData, mManager, TestProvidersAccess.DOWNLOADS, mActions, mCallback); | |
| event = KeyEvents.createLeftCtrlKey(KeyEvent.ACTION_UP); | |
| mManager.onKeyEvent(event); | |
| mEnv.beforeAsserts(); | |
| final DocumentStack expect = | |
| new DocumentStack(TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1); | |
| mClipper.copyFromClip.assertLastArgument(Pair.create(expect, mClipData)); | |
| mClipper.opType.assertLastArgument(FileOperationService.OPERATION_COPY); | |
| } | |
| @Test | |
| public void testDrop_Rejects_RootNotSupportCreate_DropOnDocument() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mManager.updateState(mUpdateShadowView, TestProvidersAccess.HAMMY, TestEnv.FOLDER_2); | |
| final DocumentStack stack = new DocumentStack( | |
| TestProvidersAccess.HAMMY, TestEnv.FOLDER_1, TestEnv.FOLDER_2); | |
| assertFalse(mManager.drop(mClipData, mManager, stack, mCallback)); | |
| } | |
| @Test | |
| public void testDrop_Copies_DifferentRoot_DropOnDocument() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.HOME, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mManager.updateState(mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_2); | |
| final DocumentStack stack = new DocumentStack( | |
| TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1, TestEnv.FOLDER_2); | |
| assertTrue(mManager.drop(mClipData, mManager, stack, mCallback)); | |
| mClipper.copyFromClip.assertLastArgument(Pair.create(stack, mClipData)); | |
| mClipper.opType.assertLastArgument(FileOperationService.OPERATION_COPY); | |
| } | |
| @Test | |
| public void testDrop_Moves_SameRoot_DropOnDocument() { | |
| mManager.startDrag( | |
| mStartDragView, | |
| Arrays.asList(TestEnv.FILE_APK, TestEnv.FILE_JPG), | |
| TestProvidersAccess.DOWNLOADS, | |
| Arrays.asList(TestEnv.FOLDER_0.derivedUri, TestEnv.FILE_APK.derivedUri, | |
| TestEnv.FILE_JPG.derivedUri), | |
| mDetails, | |
| mIconHelper, | |
| TestEnv.FOLDER_0); | |
| mManager.updateState(mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_2); | |
| final DocumentStack stack = new DocumentStack( | |
| TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1, TestEnv.FOLDER_2); | |
| assertTrue(mManager.drop(mClipData, mManager, stack, mCallback)); | |
| mClipper.copyFromClip.assertLastArgument(Pair.create(stack, mClipData)); | |
| mClipper.opType.assertLastArgument(FileOperationService.OPERATION_MOVE); | |
| } | |
| @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); | |
| mManager.updateState(mUpdateShadowView, TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_2); | |
| final DocumentStack stack = new DocumentStack( | |
| TestProvidersAccess.DOWNLOADS, TestEnv.FOLDER_1, TestEnv.FOLDER_2); | |
| assertTrue(mManager.drop(mClipData, mManager, stack, mCallback)); | |
| mClipper.copyFromClip.assertLastArgument(Pair.create(stack, mClipData)); | |
| mClipper.opType.assertLastArgument(FileOperationService.OPERATION_COPY); | |
| } | |
| private void assertStateUpdated(@State int expected) { | |
| mShadowBuilder.state.assertLastArgument(expected); | |
| mShadowUpdateListener.assertCalled(); | |
| } | |
| public static class TestDragShadowBuilder extends DragShadowBuilder { | |
| public TestEventListener<String> title; | |
| public TestEventListener<Drawable> icon; | |
| public TestEventListener<Integer> state; | |
| private TestDragShadowBuilder() { | |
| super(null); | |
| } | |
| @Override | |
| void updateTitle(String title) { | |
| this.title.accept(title); | |
| } | |
| @Override | |
| void updateIcon(Drawable icon) { | |
| this.icon.accept(icon); | |
| } | |
| @Override | |
| void onStateUpdated(@State int state) { | |
| this.state.accept(state); | |
| } | |
| public static TestDragShadowBuilder create() { | |
| TestDragShadowBuilder builder = | |
| Mockito.mock(TestDragShadowBuilder.class, Mockito.CALLS_REAL_METHODS); | |
| builder.title = new TestEventListener<>(); | |
| builder.icon = new TestEventListener<>(); | |
| builder.state = new TestEventListener<>(); | |
| return builder; | |
| } | |
| } | |
| } |