2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.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
8 // http://floralicense.org/license/
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.
19 #include <dali-toolkit-test-suite-utils.h>
20 #include <dali-toolkit/dali-toolkit.h>
21 #include <dali/integration-api/events/key-event-integ.h>
25 using namespace Dali::Toolkit;
27 void dali_keyboard_focus_manager_startup(void)
29 test_return_value = TET_UNDEF;
32 void dali_keyboard_focus_manager_cleanup(void)
34 test_return_value = TET_PASS;
41 // Functors to test whether PreFocusChange signal is emitted when the keyboard focus is about to change
42 class PreFocusChangeCallback : public Dali::ConnectionTracker
45 PreFocusChangeCallback(bool& signalReceived)
46 : mSignalVerified(signalReceived),
47 mCurrentFocusedActor(),
48 mProposedActorToFocus(),
49 mDirection(Control::Left)
53 Actor Callback(Actor currentFocusedActor, Actor proposedActorToFocus, Control::KeyboardFocusNavigationDirection direction)
55 tet_infoline("Verifying PreFocusChangeCallback()");
57 mSignalVerified = true;
59 mCurrentFocusedActor = currentFocusedActor;
60 mProposedActorToFocus = proposedActorToFocus;
61 mDirection = direction;
63 return mProposedActorToFocus;
68 mSignalVerified = false;
69 mCurrentFocusedActor = Actor();
70 mProposedActorToFocus = Actor();
71 mDirection = Control::Left;
74 bool& mSignalVerified;
75 Actor mCurrentFocusedActor;
76 Actor mProposedActorToFocus;
77 Control::KeyboardFocusNavigationDirection mDirection;
80 // Functors to test whether focus changed signal is emitted when the keyboard focus is changed
81 class FocusChangedCallback : public Dali::ConnectionTracker
84 FocusChangedCallback(bool& signalReceived)
85 : mSignalVerified(signalReceived),
86 mOriginalFocusedActor(),
87 mCurrentFocusedActor()
91 void Callback(Actor originalFocusedActor, Actor currentFocusedActor)
93 tet_infoline("Verifying FocusChangedCallback()");
95 if(originalFocusedActor == mCurrentFocusedActor)
97 mSignalVerified = true;
100 mOriginalFocusedActor = originalFocusedActor;
101 mCurrentFocusedActor = currentFocusedActor;
106 mSignalVerified = false;
109 bool& mSignalVerified;
110 Actor mOriginalFocusedActor;
111 Actor mCurrentFocusedActor;
114 // Functors to test whether focus group changed signal is emitted when the keyboard focus group is changed
115 class FocusGroupChangedCallback : public Dali::ConnectionTracker
118 FocusGroupChangedCallback(bool& signalReceived)
119 : mSignalVerified(signalReceived),
120 mCurrentFocusedActor(),
125 void Callback(Actor currentFocusedActor, bool forward)
127 tet_infoline("Verifying FocusGroupChangedCallback()");
129 mSignalVerified = true;
131 mCurrentFocusedActor = currentFocusedActor;
137 mSignalVerified = false;
140 bool& mSignalVerified;
141 Actor mCurrentFocusedActor;
145 // Functors to test whether focused actor activated signal is emitted when the focused actor is activated
146 class FocusedActorActivatedCallback : public Dali::ConnectionTracker
149 FocusedActorActivatedCallback(bool& signalReceived)
150 : mSignalVerified(signalReceived),
155 void Callback(Actor activatedActor)
157 tet_infoline("Verifying FocusedActorActivatedCallback()");
159 mSignalVerified = true;
161 mActivatedActor = activatedActor;
166 mSignalVerified = false;
169 bool& mSignalVerified;
170 Actor mActivatedActor;
177 int UtcDaliKeyboardFocusManagerGet(void)
179 ToolkitTestApplication application;
181 tet_infoline(" UtcDaliKeyboardKeyboardFocusManagerGet");
185 type = TypeRegistry::Get().GetTypeInfo( "KeyboardFocusManager" );
186 DALI_TEST_CHECK( type );
187 BaseHandle handle = type.CreateInstance();
188 DALI_TEST_CHECK( handle );
190 KeyboardFocusManager manager;
192 manager = KeyboardFocusManager::Get();
193 DALI_TEST_CHECK(manager);
195 KeyboardFocusManager newManager = KeyboardFocusManager::Get();
196 DALI_TEST_CHECK(newManager);
198 // Check that focus manager is a singleton
199 DALI_TEST_CHECK(manager == newManager);
205 int UtcDaliKeyboardFocusManagerMoveFocus(void)
207 ToolkitTestApplication application;
209 tet_infoline(" UtcDaliKeyboardFocusManagerMoveFocus");
213 type = TypeRegistry::Get().GetTypeInfo( "KeyboardFocusManager" );
214 DALI_TEST_CHECK( type );
215 BaseHandle handle = type.CreateInstance();
216 DALI_TEST_CHECK( handle );
218 KeyboardFocusManager manager = KeyboardFocusManager::Get();
219 DALI_TEST_CHECK(manager);
221 bool preFocusChangeSignalVerified = false;
222 PreFocusChangeCallback preFocusChangeCallback(preFocusChangeSignalVerified);
223 manager.PreFocusChangeSignal().Connect( &preFocusChangeCallback, &PreFocusChangeCallback::Callback );
225 bool focusChangedSignalVerified = false;
226 FocusChangedCallback focusChangedCallback(focusChangedSignalVerified);
227 manager.FocusChangedSignal().Connect( &focusChangedCallback, &FocusChangedCallback::Callback );
229 // Create the first actor and add it to the stage
230 Actor first = Actor::New();
231 first.SetKeyboardFocusable(true);
232 Stage::GetCurrent().Add(first);
234 // Create the second actor and add it to the stage
235 Actor second = Actor::New();
236 second.SetKeyboardFocusable(true);
237 Stage::GetCurrent().Add(second);
239 // Move the focus to the right
240 DALI_TEST_CHECK(manager.MoveFocus(Control::Right) == false);
242 // Because no layout control in the stage and no actor is focused, it should emit the PreFocusChange signal
243 DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified);
244 DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == Actor());
245 DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor());
246 DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::Right);
247 preFocusChangeCallback.Reset();
249 // Check that the focus is set on the first actor
250 DALI_TEST_CHECK(manager.SetCurrentFocusActor(first) == true);
251 DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first);
252 DALI_TEST_CHECK(focusChangedCallback.mSignalVerified);
253 DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == Actor());
254 DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == first);
255 focusChangedCallback.Reset();
257 // Move the focus towards right
258 DALI_TEST_CHECK(manager.MoveFocus(Control::Right) == false);
260 // Because no layout control in the stage and the first actor is focused, it should emit the PreFocusChange signal
261 DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified);
262 DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == first);
263 DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor());
264 DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::Right);
265 preFocusChangeCallback.Reset();
267 // Check that the focus is set on the second actor
268 DALI_TEST_CHECK(manager.SetCurrentFocusActor(second) == true);
269 DALI_TEST_CHECK(manager.GetCurrentFocusActor() == second);
270 DALI_TEST_CHECK(focusChangedCallback.mSignalVerified);
271 DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == first);
272 DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == second);
273 focusChangedCallback.Reset();
275 // Move the focus towards up
276 DALI_TEST_CHECK(manager.MoveFocus(Control::Up) == false);
278 // Because no layout control in the stage and no actor is focused, it should emit the PreFocusChange signal
279 DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified);
280 DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == second);
281 DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor());
282 DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::Up);
283 preFocusChangeCallback.Reset();
284 DALI_TEST_CHECK(!focusChangedCallback.mSignalVerified);
286 // Create a 2x2 table view and try to move focus inside it
287 TableView tableView = TableView::New( 2, 2 );
288 Stage::GetCurrent().Add(tableView);
290 // Create the third actor
291 Actor third = Actor::New();
292 third.SetKeyboardFocusable(true);
294 // Create the fourth actor
295 Actor fourth = Actor::New();
296 fourth.SetKeyboardFocusable(true);
298 // Add the four children to table view
299 tableView.AddChild(first, TableView::CellPosition(0, 0));
300 tableView.AddChild(second, TableView::CellPosition(0, 1));
301 tableView.AddChild(third, TableView::CellPosition(1, 0));
302 tableView.AddChild(fourth, TableView::CellPosition(1, 1));
304 // Set the focus to the first actor
305 DALI_TEST_CHECK(manager.SetCurrentFocusActor(first) == true);
306 DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first);
307 DALI_TEST_CHECK(focusChangedCallback.mSignalVerified);
308 DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == second);
309 DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == first);
310 focusChangedCallback.Reset();
312 // Move the focus towards right
313 DALI_TEST_CHECK(manager.MoveFocus(Control::Right) == true);
314 DALI_TEST_CHECK(manager.GetCurrentFocusActor() == second);
315 DALI_TEST_CHECK(focusChangedCallback.mSignalVerified);
316 DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == first);
317 DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == second);
318 focusChangedCallback.Reset();
320 // Move the focus towards down
321 DALI_TEST_CHECK(manager.MoveFocus(Control::Down) == true);
322 DALI_TEST_CHECK(manager.GetCurrentFocusActor() == fourth);
323 DALI_TEST_CHECK(focusChangedCallback.mSignalVerified);
324 DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == second);
325 DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == fourth);
326 focusChangedCallback.Reset();
328 // Move the focus towards left
329 DALI_TEST_CHECK(manager.MoveFocus(Control::Left) == true);
330 DALI_TEST_CHECK(manager.GetCurrentFocusActor() == third);
331 DALI_TEST_CHECK(focusChangedCallback.mSignalVerified);
332 DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == fourth);
333 DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == third);
334 focusChangedCallback.Reset();
336 // Move the focus towards up
337 DALI_TEST_CHECK(manager.MoveFocus(Control::Up) == true);
338 DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first);
339 DALI_TEST_CHECK(focusChangedCallback.mSignalVerified);
340 DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == third);
341 DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == first);
342 focusChangedCallback.Reset();
344 // Move the focus towards left. The focus move will fail as no way to move it upwards
345 DALI_TEST_CHECK(manager.MoveFocus(Control::Left) == false);
346 DALI_TEST_CHECK(manager.GetCurrentFocusActor() == first);
347 DALI_TEST_CHECK(preFocusChangeCallback.mSignalVerified);
348 DALI_TEST_CHECK(preFocusChangeCallback.mCurrentFocusedActor == first);
349 DALI_TEST_CHECK(preFocusChangeCallback.mProposedActorToFocus == Actor());
350 DALI_TEST_CHECK(preFocusChangeCallback.mDirection == Control::Left);
351 preFocusChangeCallback.Reset();
352 DALI_TEST_CHECK(!focusChangedCallback.mSignalVerified);
355 manager.SetFocusGroupLoop(true);
356 DALI_TEST_CHECK(manager.GetFocusGroupLoop() == true);
358 // Move the focus towards left again. The focus should move to the fourth actor.
359 DALI_TEST_CHECK(manager.MoveFocus(Control::Left) == true);
360 DALI_TEST_CHECK(manager.GetCurrentFocusActor() == fourth);
361 DALI_TEST_CHECK(focusChangedCallback.mSignalVerified);
362 DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == first);
363 DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == fourth);
364 focusChangedCallback.Reset();
369 int UtcDaliKeyboardFocusManagerSignalFocusGroupChanged(void)
371 ToolkitTestApplication application;
373 tet_infoline(" UtcDaliKeyboardFocusManagerSignalFocusGroupChanged");
377 type = TypeRegistry::Get().GetTypeInfo( "KeyboardFocusManager" );
378 DALI_TEST_CHECK( type );
379 BaseHandle handle = type.CreateInstance();
380 DALI_TEST_CHECK( handle );
382 KeyboardFocusManager manager = KeyboardFocusManager::Get();
383 DALI_TEST_CHECK(manager);
385 bool focusGroupChangedSignalVerified = false;
386 FocusGroupChangedCallback focusGroupChangedCallback(focusGroupChangedSignalVerified);
387 manager.FocusGroupChangedSignal().Connect( &focusGroupChangedCallback, &FocusGroupChangedCallback::Callback );
389 Integration::KeyEvent tabEvent("Tab", "", 0, 0, 0, Integration::KeyEvent::Down);
390 Integration::KeyEvent shiftTabEvent("Tab", "", 1, 0, 0, Integration::KeyEvent::Down);
392 // Send the tab event to change focus group in the forward direction
393 application.ProcessEvent(tabEvent);
394 DALI_TEST_CHECK(focusGroupChangedCallback.mSignalVerified);
395 DALI_TEST_CHECK(focusGroupChangedCallback.mCurrentFocusedActor == Actor());
396 DALI_TEST_CHECK(focusGroupChangedCallback.mForward == true);
397 focusGroupChangedCallback.Reset();
399 // Send the shift tab event to change focus group in the backward direction
400 application.ProcessEvent(shiftTabEvent);
401 DALI_TEST_CHECK(focusGroupChangedCallback.mSignalVerified);
402 DALI_TEST_CHECK(focusGroupChangedCallback.mCurrentFocusedActor == Actor());
403 DALI_TEST_CHECK(focusGroupChangedCallback.mForward == false);
404 focusGroupChangedCallback.Reset();