blob: 7519627bb0d04d7f7824f8f7e7767b2ff7c36d5b [file] [log] [blame]
Clara Bayarri18cc17a2015-05-07 16:13:41 +01001/*
2 * Copyright (C) 2015 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.internal.policy;
18
19import android.test.ActivityInstrumentationTestCase2;
20import android.test.UiThreadTest;
Abodunrinwa Tokifc828fe2015-07-31 15:20:06 -070021import android.test.suitebuilder.annotation.SmallTest;
Clara Bayarri18cc17a2015-05-07 16:13:41 +010022import android.view.ActionMode;
23import android.view.ActionMode.Callback;
24import android.view.KeyEvent;
Clara Bayarri75e09792015-07-29 16:20:40 +010025import android.view.KeyboardShortcutGroup;
Clara Bayarri18cc17a2015-05-07 16:13:41 +010026import android.view.Menu;
27import android.view.MenuInflater;
28import android.view.MenuItem;
29import android.view.MotionEvent;
30import android.view.SearchEvent;
31import android.view.View;
32import android.view.Window;
33import android.view.WindowManager.LayoutParams;
34import android.view.accessibility.AccessibilityEvent;
35
Clara Bayarri75e09792015-07-29 16:20:40 +010036import java.util.List;
37
Clara Bayarri18cc17a2015-05-07 16:13:41 +010038/**
39 * Tests {@link PhoneWindow}'s {@link ActionMode} related methods.
40 */
Abodunrinwa Tokifc828fe2015-07-31 15:20:06 -070041@SmallTest
Clara Bayarri18cc17a2015-05-07 16:13:41 +010042public final class PhoneWindowActionModeTest
43 extends ActivityInstrumentationTestCase2<PhoneWindowActionModeTestActivity> {
44
45 private PhoneWindow mPhoneWindow;
46 private MockWindowCallback mWindowCallback;
47 private MockActionModeCallback mActionModeCallback;
48
49 public PhoneWindowActionModeTest() {
50 super(PhoneWindowActionModeTestActivity.class);
51 }
52
53 @Override
54 protected void setUp() throws Exception {
55 super.setUp();
56 mPhoneWindow = (PhoneWindow) getActivity().getWindow();
57 mWindowCallback = new MockWindowCallback();
58 mPhoneWindow.setCallback(mWindowCallback);
59 mActionModeCallback = new MockActionModeCallback();
60 }
61
62 public void testStartActionModeWithCallback() {
63 mWindowCallback.mShouldReturnOwnActionMode = true;
64
65 ActionMode mode = mPhoneWindow.getDecorView().startActionMode(
66 mActionModeCallback, ActionMode.TYPE_FLOATING);
67
68 assertEquals(mWindowCallback.mLastCreatedActionMode, mode);
69 }
70
71 public void testStartActionModePrimaryFinishesPreviousMode() {
72 // Use custom callback to control the provided ActionMode.
73 mWindowCallback.mShouldReturnOwnActionMode = true;
74
75 ActionMode mode1 = mPhoneWindow.getDecorView().startActionMode(
76 mActionModeCallback, ActionMode.TYPE_PRIMARY);
77 ActionMode mode2 = mPhoneWindow.getDecorView().startActionMode(
78 mActionModeCallback, ActionMode.TYPE_PRIMARY);
79
80 assertTrue(mode1 instanceof MockActionMode);
81 assertTrue(((MockActionMode) mode1).mIsFinished);
82 assertNotNull(mode2);
83 }
84
85 public void testStartActionModeFloatingFinishesPreviousMode() {
86 // Use custom callback to control the provided ActionMode.
87 mWindowCallback.mShouldReturnOwnActionMode = true;
88
89 ActionMode mode1 = mPhoneWindow.getDecorView().startActionMode(
90 mActionModeCallback, ActionMode.TYPE_FLOATING);
91 ActionMode mode2 = mPhoneWindow.getDecorView().startActionMode(
92 mActionModeCallback, ActionMode.TYPE_FLOATING);
93
94 assertTrue(mode1 instanceof MockActionMode);
95 assertTrue(((MockActionMode) mode1).mIsFinished);
96 assertNotNull(mode2);
97 }
98
99 public void testStartActionModePreservesPreviousModeOfDifferentType1() {
100 // Use custom callback to control the provided ActionMode.
101 mWindowCallback.mShouldReturnOwnActionMode = true;
102
103 ActionMode mode1 = mPhoneWindow.getDecorView().startActionMode(
104 mActionModeCallback, ActionMode.TYPE_FLOATING);
105 ActionMode mode2 = mPhoneWindow.getDecorView().startActionMode(
106 mActionModeCallback, ActionMode.TYPE_PRIMARY);
107
108 assertTrue(mode1 instanceof MockActionMode);
109 assertFalse(((MockActionMode) mode1).mIsFinished);
110 assertNotNull(mode2);
111 }
112
113 public void testStartActionModePreservesPreviousModeOfDifferentType2() {
114 // Use custom callback to control the provided ActionMode.
115 mWindowCallback.mShouldReturnOwnActionMode = true;
116
117 ActionMode mode1 = mPhoneWindow.getDecorView().startActionMode(
118 mActionModeCallback, ActionMode.TYPE_PRIMARY);
119 ActionMode mode2 = mPhoneWindow.getDecorView().startActionMode(
120 mActionModeCallback, ActionMode.TYPE_FLOATING);
121
122 assertTrue(mode1 instanceof MockActionMode);
123 assertFalse(((MockActionMode) mode1).mIsFinished);
124 assertNotNull(mode2);
125 }
126
127 public void testWindowCallbackModesLifecycleIsNotHandled() {
128 mWindowCallback.mShouldReturnOwnActionMode = true;
129
130 ActionMode mode = mPhoneWindow.getDecorView().startActionMode(
131 mActionModeCallback, ActionMode.TYPE_PRIMARY);
132
133 assertNotNull(mode);
134 assertEquals(mWindowCallback.mLastCreatedActionMode, mode);
135 assertFalse(mActionModeCallback.mIsCreateActionModeCalled);
136 assertTrue(mWindowCallback.mIsActionModeStarted);
137 }
138
139 @UiThreadTest
140 public void testCreatedPrimaryModeLifecycleIsHandled() {
141 mWindowCallback.mShouldReturnOwnActionMode = false;
142
143 ActionMode mode = mPhoneWindow.getDecorView().startActionMode(
144 mActionModeCallback, ActionMode.TYPE_PRIMARY);
145
146 assertNotNull(mode);
147 assertEquals(ActionMode.TYPE_PRIMARY, mode.getType());
148 assertTrue(mActionModeCallback.mIsCreateActionModeCalled);
149 assertTrue(mWindowCallback.mIsActionModeStarted);
150 }
151
152 @UiThreadTest
153 public void testCreatedFloatingModeLifecycleIsHandled() {
154 mWindowCallback.mShouldReturnOwnActionMode = false;
155
156 ActionMode mode = mPhoneWindow.getDecorView().startActionMode(
157 mActionModeCallback, ActionMode.TYPE_FLOATING);
158
159 assertNotNull(mode);
160 assertEquals(ActionMode.TYPE_FLOATING, mode.getType());
161 assertTrue(mActionModeCallback.mIsCreateActionModeCalled);
162 assertTrue(mWindowCallback.mIsActionModeStarted);
163 }
164
165 @UiThreadTest
166 public void testCreatedModeIsNotStartedIfCreateReturnsFalse() {
167 mWindowCallback.mShouldReturnOwnActionMode = false;
168 mActionModeCallback.mShouldCreateActionMode = false;
169
170 ActionMode mode = mPhoneWindow.getDecorView().startActionMode(
171 mActionModeCallback, ActionMode.TYPE_FLOATING);
172
173 assertTrue(mActionModeCallback.mIsCreateActionModeCalled);
174 assertFalse(mWindowCallback.mIsActionModeStarted);
175 assertNull(mode);
176 }
177
178 private static final class MockWindowCallback implements Window.Callback {
179 private boolean mShouldReturnOwnActionMode = false;
180 private MockActionMode mLastCreatedActionMode;
181 private boolean mIsActionModeStarted = false;
182
183 @Override
184 public boolean dispatchKeyEvent(KeyEvent event) {
185 return false;
186 }
187
188 @Override
189 public boolean dispatchKeyShortcutEvent(KeyEvent event) {
190 return false;
191 }
192
193 @Override
194 public boolean dispatchTouchEvent(MotionEvent event) {
195 return false;
196 }
197
198 @Override
199 public boolean dispatchTrackballEvent(MotionEvent event) {
200 return false;
201 }
202
203 @Override
204 public boolean dispatchGenericMotionEvent(MotionEvent event) {
205 return false;
206 }
207
208 @Override
209 public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
210 return false;
211 }
212
213 @Override
214 public View onCreatePanelView(int featureId) {
215 return null;
216 }
217
218 @Override
219 public boolean onCreatePanelMenu(int featureId, Menu menu) {
220 return false;
221 }
222
223 @Override
224 public boolean onPreparePanel(int featureId, View view, Menu menu) {
225 return false;
226 }
227
228 @Override
229 public boolean onMenuOpened(int featureId, Menu menu) {
230 return false;
231 }
232
233 @Override
234 public boolean onMenuItemSelected(int featureId, MenuItem item) {
235 return false;
236 }
237
238 @Override
239 public void onWindowAttributesChanged(LayoutParams attrs) {}
240
241 @Override
242 public void onContentChanged() {}
243
244 @Override
245 public void onWindowFocusChanged(boolean hasFocus) {}
246
247 @Override
248 public void onAttachedToWindow() {}
249
250 @Override
251 public void onDetachedFromWindow() {}
252
253 @Override
254 public void onPanelClosed(int featureId, Menu menu) {}
255
256 @Override
257 public boolean onSearchRequested() {
258 return false;
259 }
260
261 @Override
262 public boolean onSearchRequested(SearchEvent searchEvent) {
263 return false;
264 }
265
266 @Override
267 public ActionMode onWindowStartingActionMode(Callback callback) {
268 if (mShouldReturnOwnActionMode) {
269 MockActionMode mode = new MockActionMode();
270 mLastCreatedActionMode = mode;
271 return mode;
272 }
273 return null;
274 }
275
276 @Override
277 public ActionMode onWindowStartingActionMode(Callback callback, int type) {
278 if (mShouldReturnOwnActionMode) {
279 MockActionMode mode = new MockActionMode();
280 mode.mActionModeType = type;
281 mLastCreatedActionMode = mode;
282 return mode;
283 }
284 return null;
285 }
286
287 @Override
288 public void onActionModeStarted(ActionMode mode) {
289 mIsActionModeStarted = true;
290 }
291
292 @Override
293 public void onActionModeFinished(ActionMode mode) {}
Clara Bayarri18cc17a2015-05-07 16:13:41 +0100294 }
295
296 private static final class MockActionModeCallback implements ActionMode.Callback {
297 private boolean mShouldCreateActionMode = true;
298 private boolean mIsCreateActionModeCalled = false;
299
300 @Override
301 public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
302 return true;
303 }
304
305 @Override
306 public void onDestroyActionMode(ActionMode mode) {}
307
308 @Override
309 public boolean onCreateActionMode(ActionMode mode, Menu menu) {
310 mIsCreateActionModeCalled = true;
311 return mShouldCreateActionMode;
312 }
313
314 @Override
315 public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
316 return false;
317 }
318 }
319
320 private static final class MockActionMode extends ActionMode {
321 private int mActionModeType = ActionMode.TYPE_PRIMARY;
322 private boolean mIsFinished = false;
323
324 @Override
325 public int getType() {
326 return mActionModeType;
327 }
328
329 @Override
330 public void setTitle(CharSequence title) {}
331
332 @Override
333 public void setTitle(int resId) {}
334
335 @Override
336 public void setSubtitle(CharSequence subtitle) {}
337
338 @Override
339 public void setSubtitle(int resId) {}
340
341 @Override
342 public void setCustomView(View view) {}
343
344 @Override
345 public void invalidate() {}
346
347 @Override
348 public void finish() {
349 mIsFinished = true;
350 }
351
352 @Override
353 public Menu getMenu() {
354 return null;
355 }
356
357 @Override
358 public CharSequence getTitle() {
359 return null;
360 }
361
362 @Override
363 public CharSequence getSubtitle() {
364 return null;
365 }
366
367 @Override
368 public View getCustomView() {
369 return null;
370 }
371
372 @Override
373 public MenuInflater getMenuInflater() {
374 return null;
375 }
376 }
377}