2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 #include <dali-toolkit-test-suite-utils.h>
21 #include <dali-toolkit/dali-toolkit.h>
22 #include <dali/integration-api/events/key-event-integ.h>
23 #include <dali-toolkit/devel-api/controls/control-devel.h>
24 #include <dali-toolkit/devel-api/focus-manager/keyinput-focus-manager.h>
25 #include <dali/devel-api/common/stage-devel.h>
27 #include "dummy-control.h"
30 using namespace Toolkit;
36 * Callback class for KeyInputFocusChanged signal.
38 class KeyInputFocusChangedCallback : public Dali::ConnectionTracker
43 * @param[in] gainActor Ref to the actor that should be set as the one that gains key input focus.
44 * @param[in] lostActor Ref to the actor that should be set as the one that loses key input focus.
46 KeyInputFocusChangedCallback( Control& gainActor, Control& lostActor )
47 : mActorGain( gainActor ),
48 mActorLost( lostActor )
52 void Callback( Control gainingActor, Control lostActor )
54 mActorGain = gainingActor;
55 mActorLost = lostActor;
62 // Stores data that is populated in the callback and will be read by the TET cases
66 : functorCalled(false)
71 functorCalled = false;
73 receivedKeyEvent.Reset();
78 KeyEvent receivedKeyEvent;
82 * Callback class for KeyEvent signal of control.
84 class KeyEventCallback : public Dali::ConnectionTracker
89 * @param[in] returnValue Set return value of KeyEvent callback.
91 KeyEventCallback( bool consumed )
92 : mConsumed( consumed ),
97 bool Callback( Control control, const KeyEvent& keyEvent )
103 void Callback( const KeyEvent& keyEvent )
114 void key_input_focus_manager_startup(void)
116 test_return_value = TET_UNDEF;
119 void key_input_focus_manager_cleanup(void)
121 test_return_value = TET_PASS;
124 int UtcDaliKeyInputFocusManagerGet(void)
126 ToolkitTestApplication application;
128 tet_infoline(" UtcDaliKeyInputFocusManagerGet");
130 KeyInputFocusManager manager;
132 manager = KeyInputFocusManager::Get();
133 DALI_TEST_CHECK(manager);
136 KeyInputFocusManager newManager = KeyInputFocusManager::Get();
137 DALI_TEST_CHECK(newManager);
139 // Check that focus manager is a singleton
140 DALI_TEST_CHECK(manager == newManager);
145 int UtcDaliKeyInputFocusManagerSetFocus01(void)
147 ToolkitTestApplication application;
148 Integration::Scene stage = application.GetScene();
150 tet_infoline(" Check that there is no focused control. Set focus to control. Check it is now the focused actor and receives KeyInputFocusGained signal");
152 KeyInputFocusManager manager = KeyInputFocusManager::Get();
153 DALI_TEST_CHECK(manager);
155 Control focusedControl = manager.GetCurrentFocusControl();
156 DALI_TEST_CHECK( ! focusedControl );
158 DummyControl dummy = DummyControl::New(true);
159 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummy.GetImplementation());
160 dummy.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
162 DALI_TEST_CHECK( ! dummyImpl.keyInputFocusGained );
164 manager.SetFocus( dummy );
165 DALI_TEST_CHECK( dummy.HasKeyInputFocus()); // Also tests IsKeyboardListener() API
166 DALI_TEST_CHECK( dummyImpl.keyInputFocusGained );
168 focusedControl = manager.GetCurrentFocusControl();
169 DALI_TEST_CHECK( focusedControl );
170 DALI_TEST_CHECK( focusedControl == dummy );
175 int UtcDaliKeyInputFocusManagerSetFocus02(void)
177 ToolkitTestApplication application;
178 Integration::Scene stage = application.GetScene();
180 tet_infoline(" Set focus to control. Check it is now the focused actor and receives KeyInputFocusGained signal. Set focuse to another control - check that the first control receives KeyInputFocusLost");
182 KeyInputFocusManager manager = KeyInputFocusManager::Get();
183 DALI_TEST_CHECK(manager);
185 DummyControl dummy1 = DummyControl::New(true);
186 Impl::DummyControl& dummy1Impl = static_cast<Impl::DummyControl&>(dummy1.GetImplementation());
187 dummy1.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
189 DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
190 DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
192 manager.SetFocus( dummy1 );
193 DALI_TEST_CHECK( dummy1.HasKeyInputFocus()); // Also tests IsKeyboardListener() API
194 DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
195 dummy1Impl.keyInputFocusGained = false;
197 DummyControl dummy2 = DummyControl::New(true);
198 Impl::DummyControl& dummy2Impl = static_cast<Impl::DummyControl&>(dummy2.GetImplementation());
199 dummy2.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
201 DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
202 DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
204 manager.SetFocus( dummy2 );
205 DALI_TEST_CHECK( dummy2.HasKeyInputFocus()); // Also tests IsKeyboardListener() API
206 DALI_TEST_CHECK( dummy2Impl.keyInputFocusGained );
207 dummy1Impl.keyInputFocusGained = false;
209 DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
210 DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
215 int UtcDaliKeyInputFocusManagerKeyEventPropagation01(void)
218 ToolkitTestApplication application;
219 Integration::Scene stage = application.GetScene();
221 tet_infoline("Test KeyEvent propagation. If focused control doesn't consume KeyEvent, KeyEvent will be recursively delivered to the control and its parents, until the event is consumed or the stage is reached. In this case, KeyEvent is delivered to KeyboardFocusManager via Stage's KeyEventSignal");
223 KeyInputFocusManager manager = KeyInputFocusManager::Get();
224 DALI_TEST_CHECK(manager);
226 KeyEventCallback stageCallback( false );
227 stage.KeyEventSignal().Connect( &stageCallback, &KeyEventCallback::Callback );
229 DummyControl dummy1 = DummyControl::New(true);
230 dummy1.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
231 KeyEventCallback callback1( false );
232 dummy1.KeyEventSignal().Connect( &callback1, &KeyEventCallback::Callback );
235 DummyControl dummy2 = DummyControl::New(true);
236 dummy2.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
237 KeyEventCallback callback2( false );
238 dummy2.KeyEventSignal().Connect( &callback2, &KeyEventCallback::Callback );
239 dummy1.Add( dummy2 );
241 DummyControl dummy3 = DummyControl::New(true);
242 Impl::DummyControl& dummy3Impl = static_cast<Impl::DummyControl&>(dummy3.GetImplementation());
243 dummy3.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
244 KeyEventCallback callback3( false );
245 dummy3.KeyEventSignal().Connect( &callback3, &KeyEventCallback::Callback );
246 dummy2.Add( dummy3 );
247 DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusGained );
248 DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusLost );
250 manager.SetFocus( dummy3 );
251 DALI_TEST_CHECK( dummy3Impl.keyInputFocusGained );
253 Integration::KeyEvent event( "a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "", "", Device::Class::TOUCH, Device::Subclass::NONE );
254 application.ProcessEvent(event);
256 DALI_TEST_CHECK( callback1.mIsCalled );
257 DALI_TEST_CHECK( callback2.mIsCalled );
258 DALI_TEST_CHECK( callback3.mIsCalled );
259 DALI_TEST_CHECK( stageCallback.mIsCalled );
264 int UtcDaliKeyInputFocusManagerKeyEventPropagation02(void)
267 ToolkitTestApplication application;
268 Integration::Scene stage = application.GetScene();
270 tet_infoline("Test KeyEvent propagation. If focused control doesn't consume KeyEvent, KeyEvent will be recursively delivered to the control and its parents, until the event is consumed or the stage is reached. In this case, KeyEvent is delivered from dummy3 to dummy2");
272 KeyInputFocusManager manager = KeyInputFocusManager::Get();
273 DALI_TEST_CHECK(manager);
275 DummyControl dummy1 = DummyControl::New(true);
276 dummy1.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
277 KeyEventCallback callback1( false );
278 dummy1.KeyEventSignal().Connect( &callback1, &KeyEventCallback::Callback );
281 DummyControl dummy2 = DummyControl::New(true);
282 dummy2.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
283 KeyEventCallback callback2( true );
284 dummy2.KeyEventSignal().Connect( &callback2, &KeyEventCallback::Callback );
285 dummy1.Add( dummy2 );
287 DummyControl dummy3 = DummyControl::New(true);
288 Impl::DummyControl& dummy3Impl = static_cast<Impl::DummyControl&>(dummy3.GetImplementation());
289 dummy3.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
290 KeyEventCallback callback3( false );
291 dummy3.KeyEventSignal().Connect( &callback3, &KeyEventCallback::Callback );
292 dummy2.Add( dummy3 );
293 DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusGained );
294 DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusLost );
296 manager.SetFocus( dummy3 );
297 DALI_TEST_CHECK( dummy3Impl.keyInputFocusGained );
299 Integration::KeyEvent event( "a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "", "", Device::Class::TOUCH, Device::Subclass::NONE );
300 application.ProcessEvent(event);
302 DALI_TEST_CHECK( !callback1.mIsCalled );
303 DALI_TEST_CHECK( callback2.mIsCalled );
304 DALI_TEST_CHECK( callback3.mIsCalled );
309 int UtcDaliKeyInputFocusManagerDispatchKeyEvents(void)
312 ToolkitTestApplication application;
313 Integration::Scene stage = application.GetScene();
315 tet_infoline("Test KeyEvents propagation. If DISPATCH_KEY_EVENTS property is false, the KeyEvent is also not received.");
317 KeyInputFocusManager manager = KeyInputFocusManager::Get();
318 DALI_TEST_CHECK(manager);
320 DummyControl dummy1 = DummyControl::New(true);
321 dummy1.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
322 KeyEventCallback callback1( false );
323 dummy1.KeyEventSignal().Connect( &callback1, &KeyEventCallback::Callback );
326 DummyControl dummy2 = DummyControl::New(true);
327 dummy2.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
328 KeyEventCallback callback2( false );
329 dummy2.KeyEventSignal().Connect( &callback2, &KeyEventCallback::Callback );
330 // dummy2 set DISPATCH_KEY_EVENTS property to false.
331 dummy2.SetProperty( Toolkit::DevelControl::Property::DISPATCH_KEY_EVENTS, false);
332 dummy1.Add( dummy2 );
334 DummyControl dummy3 = DummyControl::New(true);
335 Impl::DummyControl& dummy3Impl = static_cast<Impl::DummyControl&>(dummy3.GetImplementation());
336 dummy3.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
337 KeyEventCallback callback3( false );
338 dummy3.KeyEventSignal().Connect( &callback3, &KeyEventCallback::Callback );
339 dummy2.Add( dummy3 );
340 DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusGained );
341 DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusLost );
343 manager.SetFocus( dummy3 );
344 DALI_TEST_CHECK( dummy3Impl.keyInputFocusGained );
346 Integration::KeyEvent event( "a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "", "", Device::Class::TOUCH, Device::Subclass::NONE );
347 application.ProcessEvent(event);
349 DALI_TEST_CHECK( !callback1.mIsCalled );
350 DALI_TEST_CHECK( !callback2.mIsCalled );
351 DALI_TEST_CHECK( !callback3.mIsCalled );
356 int UtcDaliKeyInputFocusManagerGetCurrentFocusControl(void)
358 ToolkitTestApplication application;
359 Integration::Scene stage = application.GetScene();
361 tet_infoline(" Add 2 controls, check they each get focused. Re-focus the first control - ensure it's now got focus (check signals)");
363 KeyInputFocusManager manager = KeyInputFocusManager::Get();
364 DALI_TEST_CHECK(manager);
366 DummyControl dummy1 = DummyControl::New(true);
367 Impl::DummyControl& dummy1Impl = static_cast<Impl::DummyControl&>(dummy1.GetImplementation());
368 dummy1.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
370 DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
371 DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
373 DummyControl dummy2 = DummyControl::New(true);
374 Impl::DummyControl& dummy2Impl = static_cast<Impl::DummyControl&>(dummy2.GetImplementation());
375 dummy2.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
377 DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
378 DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
380 manager.SetFocus(dummy1);
381 DALI_TEST_CHECK( dummy1 == manager.GetCurrentFocusControl() );
382 DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
383 DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
384 dummy1Impl.keyInputFocusGained = false;
385 dummy1Impl.keyInputFocusLost = false;
387 manager.SetFocus(dummy2);
388 DALI_TEST_CHECK( dummy2 == manager.GetCurrentFocusControl() );
389 DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
390 DALI_TEST_CHECK( dummy2Impl.keyInputFocusGained );
391 DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
392 DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
393 // Reset signal received
394 dummy1Impl.keyInputFocusGained = false;
395 dummy1Impl.keyInputFocusLost = false;
396 dummy2Impl.keyInputFocusGained = false;
397 dummy2Impl.keyInputFocusLost = false;
399 manager.SetFocus(dummy1);
400 DALI_TEST_CHECK( dummy1 == manager.GetCurrentFocusControl());
401 DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
402 DALI_TEST_CHECK( dummy2Impl.keyInputFocusLost );
403 DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
404 DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
408 int UtcDaliKeyInputFocusManagerRemoveFocus(void)
410 ToolkitTestApplication application;
411 Integration::Scene stage = application.GetScene();
413 tet_infoline(" Add focus controls. Test that removing focus from control which has focus. ");
415 KeyInputFocusManager manager = KeyInputFocusManager::Get();
416 DALI_TEST_CHECK(manager);
418 DummyControl dummy1 = DummyControl::New(true);
419 Impl::DummyControl& dummy1Impl = static_cast<Impl::DummyControl&>(dummy1.GetImplementation());
420 dummy1.SetProperty( Actor::Property::SIZE, Vector2(100.0f, 100.0f) );
422 DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
423 DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
425 manager.SetFocus(dummy1);
426 DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
427 dummy1Impl.keyInputFocusGained = false;
428 dummy1Impl.keyInputFocusLost = false;
430 manager.RemoveFocus(dummy1);
431 DALI_TEST_CHECK(Control() == manager.GetCurrentFocusControl());
432 DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
433 DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
438 int UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged(void)
440 ToolkitTestApplication application;
441 KeyInputFocusManager manager = KeyInputFocusManager::Get();
442 Integration::Scene stage = application.GetScene();
444 tet_infoline(" UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged");
446 PushButton pushButton1 = PushButton::New();
447 PushButton pushButton2 = PushButton::New();
449 stage.Add( pushButton1 );
450 stage.Add( pushButton2 );
452 PushButton gainActor, lostActor;
453 KeyInputFocusChangedCallback callback( gainActor, lostActor );
454 manager.KeyInputFocusChangedSignal().Connect( &callback, &KeyInputFocusChangedCallback::Callback );
456 manager.SetFocus(pushButton1);
458 DALI_TEST_CHECK( gainActor == pushButton1 );
459 DALI_TEST_CHECK( lostActor == Control() );
464 manager.SetFocus(pushButton2);
466 DALI_TEST_CHECK( gainActor == pushButton2 );
467 DALI_TEST_CHECK( lostActor == pushButton1 );
472 // Removing the focus actor from the stage would also result in signal emission.
473 stage.Remove( pushButton1 );
474 stage.Remove( pushButton2 );
476 DALI_TEST_CHECK( gainActor == Control() );
477 DALI_TEST_CHECK( lostActor == Control() );
481 int UtcDaliKeyInputFocusManagerSignalKeyInputFocusChangedforNewWindow(void)
483 ToolkitTestApplication application;
484 KeyInputFocusManager manager = KeyInputFocusManager::Get();
486 tet_infoline(" UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged");
488 PushButton pushButton1 = PushButton::New();
489 PushButton pushButton2 = PushButton::New();
491 Window window = Window::New(PositionSize(0,0,0,0) ,"", false);
492 DALI_TEST_CHECK( window );
494 window.Add( pushButton1 );
495 window.Add( pushButton2 );
497 PushButton gainActor, lostActor;
498 KeyInputFocusChangedCallback callback( gainActor, lostActor );
499 manager.KeyInputFocusChangedSignal().Connect( &callback, &KeyInputFocusChangedCallback::Callback );
501 manager.SetFocus(pushButton1);
503 DALI_TEST_CHECK( gainActor == pushButton1 );
504 DALI_TEST_CHECK( lostActor == Control() );
509 manager.SetFocus(pushButton2);
511 DALI_TEST_CHECK( gainActor == pushButton2 );
512 DALI_TEST_CHECK( lostActor == pushButton1 );
517 // Removing the focus actor from the window would also result in signal emission.
518 window.Remove( pushButton1 );
519 window.Remove( pushButton2 );
520 DALI_TEST_CHECK( gainActor == Control() );
521 DALI_TEST_CHECK( lostActor == Control() );