135f99e02f3fa8af21139be216fc57c123779808dBen Lin/* 235f99e02f3fa8af21139be216fc57c123779808dBen Lin * Copyright (C) 2016 The Android Open Source Project 335f99e02f3fa8af21139be216fc57c123779808dBen Lin * 435f99e02f3fa8af21139be216fc57c123779808dBen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 535f99e02f3fa8af21139be216fc57c123779808dBen Lin * you may not use this file except in compliance with the License. 635f99e02f3fa8af21139be216fc57c123779808dBen Lin * You may obtain a copy of the License at 735f99e02f3fa8af21139be216fc57c123779808dBen Lin * 835f99e02f3fa8af21139be216fc57c123779808dBen Lin * http://www.apache.org/licenses/LICENSE-2.0 935f99e02f3fa8af21139be216fc57c123779808dBen Lin * 1035f99e02f3fa8af21139be216fc57c123779808dBen Lin * Unless required by applicable law or agreed to in writing, software 1135f99e02f3fa8af21139be216fc57c123779808dBen Lin * distributed under the License is distributed on an "AS IS" BASIS, 1235f99e02f3fa8af21139be216fc57c123779808dBen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1335f99e02f3fa8af21139be216fc57c123779808dBen Lin * See the License for the specific language governing permissions and 1435f99e02f3fa8af21139be216fc57c123779808dBen Lin * limitations under the License. 1535f99e02f3fa8af21139be216fc57c123779808dBen Lin */ 1635f99e02f3fa8af21139be216fc57c123779808dBen Lin 1735f99e02f3fa8af21139be216fc57c123779808dBen Linpackage com.android.documentsui.dirlist; 1835f99e02f3fa8af21139be216fc57c123779808dBen Lin 19da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport static junit.framework.Assert.assertFalse; 20da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport static junit.framework.Assert.assertTrue; 21da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport static junit.framework.TestCase.fail; 22da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan 23da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport android.provider.DocumentsContract; 24da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport android.support.test.filters.SmallTest; 25da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport android.support.test.runner.AndroidJUnit4; 261597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKayimport android.view.MotionEvent; 2735f99e02f3fa8af21139be216fc57c123779808dBen Linimport android.view.View; 2835f99e02f3fa8af21139be216fc57c123779808dBen Lin 297f7ee10edaac1214e23f267a595014b510562d1eBen Linimport com.android.documentsui.MenuManager; 307f7ee10edaac1214e23f267a595014b510562d1eBen Linimport com.android.documentsui.MenuManager.SelectionDetails; 31da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport com.android.documentsui.base.DocumentInfo; 32da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport com.android.documentsui.base.Providers; 33d9caa6ab53aa784acaf241c0ded3c4ae2d342bf8Steve McKayimport com.android.documentsui.base.State; 34329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Linimport com.android.documentsui.dirlist.DragStartListener.ActiveListener; 35d9caa6ab53aa784acaf241c0ded3c4ae2d342bf8Steve McKayimport com.android.documentsui.base.Events.InputEvent; 364f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKayimport com.android.documentsui.selection.SelectionManager; 374f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKayimport com.android.documentsui.selection.Selection; 38da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport com.android.documentsui.testing.TestDragAndDropManager; 391597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKayimport com.android.documentsui.testing.TestEvent; 405b0a2c187a9e446b683687817d22cbe443585223Steve McKayimport com.android.documentsui.testing.SelectionManagers; 417f7ee10edaac1214e23f267a595014b510562d1eBen Linimport com.android.documentsui.testing.TestSelectionDetails; 42f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKayimport com.android.documentsui.testing.Views; 4335f99e02f3fa8af21139be216fc57c123779808dBen Lin 44da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport org.junit.Before; 45da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport org.junit.Test; 46da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanimport org.junit.runner.RunWith; 47da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan 4835f99e02f3fa8af21139be216fc57c123779808dBen Linimport java.util.ArrayList; 4935f99e02f3fa8af21139be216fc57c123779808dBen Lin 50da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan@RunWith(AndroidJUnit4.class) 5135f99e02f3fa8af21139be216fc57c123779808dBen Lin@SmallTest 52da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tanpublic class DragStartListenerTest { 5335f99e02f3fa8af21139be216fc57c123779808dBen Lin 54329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin private ActiveListener mListener; 551597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay private TestEvent.Builder mEvent; 564f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKay private SelectionManager mMultiSelectManager; 577f7ee10edaac1214e23f267a595014b510562d1eBen Lin private SelectionDetails mSelectionDetails; 581597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay private String mViewModelId; 59da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan private TestDragAndDropManager mManager; 6035f99e02f3fa8af21139be216fc57c123779808dBen Lin 61da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan @Before 6235f99e02f3fa8af21139be216fc57c123779808dBen Lin public void setUp() throws Exception { 635b0a2c187a9e446b683687817d22cbe443585223Steve McKay mMultiSelectManager = SelectionManagers.createTestInstance(); 64da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan mManager = new TestDragAndDropManager(); 657f7ee10edaac1214e23f267a595014b510562d1eBen Lin mSelectionDetails = new TestSelectionDetails(); 66da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan 67da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan DocumentInfo doc = new DocumentInfo(); 68da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan doc.authority = Providers.AUTHORITY_STORAGE; 69da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan doc.documentId = "id"; 70da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan doc.derivedUri = DocumentsContract.buildDocumentUri(doc.authority, doc.documentId); 71f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay 72da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan State state = new State(); 73da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan state.stack.push(doc); 741597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay mListener = new DragStartListener.ActiveListener( 75da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan null, // icon helper 76da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan state, 77f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay mMultiSelectManager, 787f7ee10edaac1214e23f267a595014b510562d1eBen Lin mSelectionDetails, 79f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay // view finder 80f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay (float x, float y) -> { 81f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay return Views.createTestView(x, y); 82f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay }, 83f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay // model id finder 84f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay (View view) -> { 851597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay return mViewModelId; 86f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay }, 875a305b41ecd9c563c54bda9ff3c0d0f3739c5bdaBen Lin // docInfo Converter 885a305b41ecd9c563c54bda9ff3c0d0f3739c5bdaBen Lin (Selection selection) -> { 89da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan return new ArrayList<DocumentInfo>(); 905a305b41ecd9c563c54bda9ff3c0d0f3739c5bdaBen Lin }, 91da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan mManager); 92da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan 931597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay mViewModelId = "1234"; 941597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay 951597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay mEvent = TestEvent.builder() 961597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay .action(MotionEvent.ACTION_MOVE) 971597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay .mouse() 981597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay .at(1) 99f88bc0b6f1945db1eb11afcfb15bc2c08b13ba9fBen Lin .inDragHotspot() 1001597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay .primary(); 10135f99e02f3fa8af21139be216fc57c123779808dBen Lin } 10235f99e02f3fa8af21139be216fc57c123779808dBen Lin 103da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan @Test 104f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay public void testDragStarted_OnMouseMove() { 1051597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay assertTrue(mListener.onMouseDragEvent(mEvent.build())); 106da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan mManager.startDragHandler.assertCalled(); 10735f99e02f3fa8af21139be216fc57c123779808dBen Lin } 10835f99e02f3fa8af21139be216fc57c123779808dBen Lin 109da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan @Test 110f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay public void testDragNotStarted_NonModelBackedView() { 1111597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay mViewModelId = null; 1121597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay assertFalse(mListener.onMouseDragEvent(mEvent.build())); 113da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan mManager.startDragHandler.assertNotCalled(); 11435f99e02f3fa8af21139be216fc57c123779808dBen Lin } 11535f99e02f3fa8af21139be216fc57c123779808dBen Lin 116da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan @Test 117f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay public void testThrows_OnNonMouseMove() { 1181597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay TestEvent e = TestEvent.builder() 1191597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay .at(1) 1201597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay .action(MotionEvent.ACTION_MOVE).build(); 1211597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay assertThrows(e); 122f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay } 123f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay 124da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan @Test 125f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay public void testThrows_OnNonPrimaryMove() { 1261597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay assertThrows(mEvent.pressButton(MotionEvent.BUTTON_PRIMARY).build()); 12735f99e02f3fa8af21139be216fc57c123779808dBen Lin } 12835f99e02f3fa8af21139be216fc57c123779808dBen Lin 129da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan @Test 130f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay public void testThrows_OnNonMove() { 1311597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay assertThrows(mEvent.action(MotionEvent.ACTION_UP).build()); 13235f99e02f3fa8af21139be216fc57c123779808dBen Lin } 13335f99e02f3fa8af21139be216fc57c123779808dBen Lin 134da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan @Test 135f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay public void testThrows_WhenNotOnItem() { 1361597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay assertThrows(mEvent.at(-1).build()); 137f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay } 138f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay 139da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan @Test 140329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin public void testDragStart_nonSelectedItem() { 141329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin Selection selection = mListener.getSelectionToBeCopied("1234", 142329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin mEvent.action(MotionEvent.ACTION_MOVE).build()); 143329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin assertTrue(selection.size() == 1); 144329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin assertTrue(selection.contains("1234")); 145329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin } 146329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin 147da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan @Test 148329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin public void testDragStart_selectedItem() { 149329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin Selection selection = new Selection(); 150329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin selection.add("1234"); 151329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin selection.add("5678"); 152329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin mMultiSelectManager.replaceSelection(selection); 153329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin 154329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin selection = mListener.getSelectionToBeCopied("1234", 155329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin mEvent.action(MotionEvent.ACTION_MOVE).build()); 156329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin assertTrue(selection.size() == 2); 157329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin assertTrue(selection.contains("1234")); 158329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin assertTrue(selection.contains("5678")); 159329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin } 160329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin 161da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan @Test 162329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin public void testDragStart_newNonSelectedItem() { 163329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin Selection selection = new Selection(); 164329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin selection.add("5678"); 165329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin mMultiSelectManager.replaceSelection(selection); 166329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin 167329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin selection = mListener.getSelectionToBeCopied("1234", 168329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin mEvent.action(MotionEvent.ACTION_MOVE).build()); 169329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin assertTrue(selection.size() == 1); 170329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin assertTrue(selection.contains("1234")); 171329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin // After this, selection should be cleared 172329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin assertFalse(mMultiSelectManager.hasSelection()); 173329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin } 174329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin 175da2c0f0b075ad9f770182e706c2ec158989568a7Garfield Tan @Test 176329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin public void testCtrlDragStart_newNonSelectedItem() { 177329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin Selection selection = new Selection(); 178329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin selection.add("5678"); 179329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin mMultiSelectManager.replaceSelection(selection); 180329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin 181329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin selection = mListener.getSelectionToBeCopied("1234", 182329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin mEvent.action(MotionEvent.ACTION_MOVE).ctrl().build()); 183329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin assertTrue(selection.size() == 2); 184329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin assertTrue(selection.contains("1234")); 185329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin assertTrue(selection.contains("5678")); 186329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin } 187329eb937ce0e2ff9fb1ff807624a9e56cf3a3c6dBen Lin 1881597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay private void assertThrows(InputEvent e) { 189f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay try { 1901597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay assertFalse(mListener.onMouseDragEvent(e)); 191f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay fail(); 192f0fceb4cd731f70270970279791365cc6f6e4a49Steve McKay } catch (AssertionError expected) {} 19335f99e02f3fa8af21139be216fc57c123779808dBen Lin } 19435f99e02f3fa8af21139be216fc57c123779808dBen Lin} 195