1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.documentsui.selection;
18
19import android.graphics.Point;
20import android.graphics.Rect;
21import android.support.v7.widget.RecyclerView.OnScrollListener;
22import android.test.AndroidTestCase;
23import android.test.suitebuilder.annotation.SmallTest;
24import android.view.MotionEvent;
25
26import com.android.documentsui.DirectoryReloadLock;
27import com.android.documentsui.dirlist.TestData;
28import com.android.documentsui.dirlist.TestDocumentsAdapter;
29import com.android.documentsui.dirlist.TestFocusHandler;
30import com.android.documentsui.testing.SelectionManagers;
31import com.android.documentsui.testing.TestEvent.Builder;
32
33import java.util.Collections;
34import java.util.List;
35
36@SmallTest
37public class BandControllerTest extends AndroidTestCase {
38
39    private static final List<String> ITEMS = TestData.create(10);
40    private BandController mBandController;
41    private boolean mIsActive;
42
43    @Override
44    public void setUp() throws Exception {
45        mIsActive = false;
46        mBandController = new BandController(new TestSelectionEnvironment(),
47                new TestDocumentsAdapter(ITEMS), SelectionManagers.createTestInstance(ITEMS),
48                new DirectoryReloadLock(), null) {
49          @Override
50          public boolean isActive() {
51              return mIsActive;
52          }
53        };
54    }
55
56    public void testGoodStart() {
57        assertTrue(mBandController.shouldStart(goodStartEventBuilder().build()));
58    }
59
60    public void testBadStart_NoButtons() {
61        assertFalse(mBandController.shouldStart(
62                goodStartEventBuilder().releaseButton(MotionEvent.BUTTON_PRIMARY).build()));
63    }
64
65    public void testBadStart_SecondaryButton() {
66        assertFalse(
67                mBandController.shouldStart(goodStartEventBuilder().secondary().build()));
68    }
69
70    public void testBadStart_TertiaryButton() {
71        assertFalse(
72                mBandController.shouldStart(goodStartEventBuilder().tertiary().build()));
73    }
74
75    public void testBadStart_Touch() {
76        assertFalse(mBandController.shouldStart(
77                goodStartEventBuilder().touch().releaseButton(MotionEvent.BUTTON_PRIMARY).build()));
78    }
79
80    public void testBadStart_inDragSpot() {
81        assertFalse(
82                mBandController.shouldStart(goodStartEventBuilder().at(1).inDragHotspot().build()));
83    }
84
85    public void testBadStart_ActionDown() {
86        assertFalse(mBandController
87                .shouldStart(goodStartEventBuilder().action(MotionEvent.ACTION_DOWN).build()));
88    }
89
90    public void testBadStart_ActionUp() {
91        assertFalse(mBandController
92                .shouldStart(goodStartEventBuilder().action(MotionEvent.ACTION_UP).build()));
93    }
94
95    public void testBadStart_ActionPointerDown() {
96        assertFalse(mBandController.shouldStart(
97                goodStartEventBuilder().action(MotionEvent.ACTION_POINTER_DOWN).build()));
98    }
99
100    public void testBadStart_ActionPointerUp() {
101        assertFalse(mBandController.shouldStart(
102                goodStartEventBuilder().action(MotionEvent.ACTION_POINTER_UP).build()));
103    }
104
105    public void testBadStart_NoItems() {
106        mBandController = new BandController(new TestSelectionEnvironment(),
107                new TestDocumentsAdapter(Collections.EMPTY_LIST),
108                SelectionManagers.createTestInstance(ITEMS),
109                new DirectoryReloadLock(), null);
110        assertFalse(mBandController.shouldStart(goodStartEventBuilder().build()));
111    }
112
113    public void testBadStart_alreadyActive() {
114        mIsActive = true;
115        assertFalse(mBandController.shouldStart(goodStartEventBuilder().build()));
116    }
117
118    public void testGoodStop() {
119        mIsActive = true;
120        assertTrue(mBandController.shouldStop(goodStopEventBuilder().build()));
121    }
122
123    public void testGoodStop_PointerUp() {
124        mIsActive = true;
125        assertTrue(mBandController
126                .shouldStop(goodStopEventBuilder().action(MotionEvent.ACTION_POINTER_UP).build()));
127    }
128
129    public void testGoodStop_Cancel() {
130        mIsActive = true;
131        assertTrue(mBandController
132                .shouldStop(goodStopEventBuilder().action(MotionEvent.ACTION_CANCEL).build()));
133    }
134
135    public void testBadStop_NotActive() {
136        assertFalse(mBandController.shouldStop(goodStopEventBuilder().build()));
137    }
138
139    public void testBadStop_NonMouse() {
140        mIsActive = true;
141        assertFalse(mBandController.shouldStop(goodStopEventBuilder().touch().build()));
142    }
143
144    public void testBadStop_Move() {
145        mIsActive = true;
146        assertFalse(mBandController.shouldStop(
147                goodStopEventBuilder().action(MotionEvent.ACTION_MOVE).touch().build()));
148    }
149
150    public void testBadStop_Down() {
151        mIsActive = true;
152        assertFalse(mBandController.shouldStop(
153                goodStopEventBuilder().action(MotionEvent.ACTION_DOWN).touch().build()));
154    }
155
156
157    private Builder goodStartEventBuilder() {
158        return new Builder().mouse().primary().action(MotionEvent.ACTION_MOVE).notInDragHotspot();
159    }
160
161    private Builder goodStopEventBuilder() {
162        return new Builder().mouse().action(MotionEvent.ACTION_UP).notInDragHotspot();
163    }
164
165    private final class TestSelectionEnvironment implements BandController.SelectionEnvironment {
166        @Override
167        public void scrollBy(int dy) {
168        }
169
170        @Override
171        public void runAtNextFrame(Runnable r) {
172        }
173
174        @Override
175        public void removeCallback(Runnable r) {
176        }
177
178        @Override
179        public void showBand(Rect rect) {
180        }
181
182        @Override
183        public void hideBand() {
184        }
185
186        @Override
187        public void addOnScrollListener(OnScrollListener listener) {
188        }
189
190        @Override
191        public void removeOnScrollListener(OnScrollListener listener) {
192        }
193
194        @Override
195        public int getHeight() {
196            return 0;
197        }
198
199        @Override
200        public void invalidateView() {
201        }
202
203        @Override
204        public Point createAbsolutePoint(Point relativePoint) {
205            return null;
206        }
207
208        @Override
209        public Rect getAbsoluteRectForChildViewAt(int index) {
210            return null;
211        }
212
213        @Override
214        public int getAdapterPositionAt(int index) {
215            return 0;
216        }
217
218        @Override
219        public int getColumnCount() {
220            return 0;
221        }
222
223        @Override
224        public int getChildCount() {
225            return 0;
226        }
227
228        @Override
229        public int getVisibleChildCount() {
230            return 0;
231        }
232
233        @Override
234        public boolean hasView(int adapterPosition) {
235            return false;
236        }
237    }
238}
239