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