895 lines
33 KiB
Java
895 lines
33 KiB
Java
/*
|
|
* 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;
|
|
}
|
|
}
|
|
}
|