[dali_2.3.19] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-KeyInputFocusManager.cpp
index cf1a006..8377ec7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  *
  */
 
-#include <iostream>
-#include <stdlib.h>
 #include <dali-toolkit-test-suite-utils.h>
 #include <dali-toolkit/dali-toolkit.h>
-#include <dali/integration-api/events/key-event-integ.h>
+#include <dali-toolkit/devel-api/controls/control-devel.h>
 #include <dali-toolkit/devel-api/focus-manager/keyinput-focus-manager.h>
 #include <dali/devel-api/common/stage-devel.h>
+#include <dali/integration-api/events/key-event-integ.h>
+#include <stdlib.h>
+#include <iostream>
 
 #include "dummy-control.h"
 
@@ -30,7 +31,6 @@ using namespace Toolkit;
 
 namespace
 {
-
 /**
  * Callback class for KeyInputFocusChanged signal.
  */
@@ -42,13 +42,13 @@ public:
    * @param[in]  gainActor  Ref to the actor that should be set as the one that gains key input focus.
    * @param[in]  lostActor  Ref to the actor that should be set as the one that loses key input focus.
    */
-  KeyInputFocusChangedCallback( Control& gainActor, Control& lostActor )
-  : mActorGain( gainActor ),
-    mActorLost( lostActor )
+  KeyInputFocusChangedCallback(Control& gainActor, Control& lostActor)
+  : mActorGain(gainActor),
+    mActorLost(lostActor)
   {
   }
 
-  void Callback( Control gainingActor, Control lostActor )
+  void Callback(Control gainingActor, Control lostActor)
   {
     mActorGain = gainingActor;
     mActorLost = lostActor;
@@ -63,19 +63,17 @@ struct SignalData
 {
   SignalData()
   : functorCalled(false)
-  {}
+  {
+  }
 
   void Reset()
   {
     functorCalled = false;
 
-    receivedKeyEvent.keyModifier = 0;
-    receivedKeyEvent.keyPressedName.clear();
-    receivedKeyEvent.keyPressed.clear();
-
+    receivedKeyEvent.Reset();
   }
 
-  bool functorCalled;
+  bool     functorCalled;
   KeyEvent receivedKeyEvent;
 };
 
@@ -89,19 +87,19 @@ public:
    * Constructor
    * @param[in]  returnValue  Set return value of KeyEvent callback.
    * */
-  KeyEventCallback( bool consumed )
-  : mConsumed( consumed ),
-    mIsCalled( false )
+  KeyEventCallback(bool consumed)
+  : mConsumed(consumed),
+    mIsCalled(false)
   {
   }
 
-  bool Callback( Control control, const KeyEvent& keyEvent )
+  bool Callback(Control control, const KeyEvent& keyEvent)
   {
     mIsCalled = true;
     return mConsumed;
   }
 
-  void Callback( const KeyEvent& keyEvent )
+  void Callback(const KeyEvent& keyEvent)
   {
     mIsCalled = true;
   }
@@ -139,13 +137,14 @@ int UtcDaliKeyInputFocusManagerGet(void)
 
   // Check that focus manager is a singleton
   DALI_TEST_CHECK(manager == newManager);
+
   END_TEST;
 }
 
 int UtcDaliKeyInputFocusManagerSetFocus01(void)
 {
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene     stage = application.GetScene();
 
   tet_infoline(" Check that there is no focused control. Set focus to control. Check it is now the focused actor and receives KeyInputFocusGained signal");
 
@@ -153,21 +152,21 @@ int UtcDaliKeyInputFocusManagerSetFocus01(void)
   DALI_TEST_CHECK(manager);
 
   Control focusedControl = manager.GetCurrentFocusControl();
-  DALI_TEST_CHECK( ! focusedControl );
+  DALI_TEST_CHECK(!focusedControl);
 
-  DummyControl dummy = DummyControl::New(true);
+  DummyControl        dummy     = DummyControl::New(true);
   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummy.GetImplementation());
-  dummy.SetSize(100.0f, 100.0f);
-  stage.Add( dummy );
-  DALI_TEST_CHECK( ! dummyImpl.keyInputFocusGained );
+  dummy.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  stage.Add(dummy);
+  DALI_TEST_CHECK(!dummyImpl.keyInputFocusGained);
 
-  manager.SetFocus( dummy );
-  DALI_TEST_CHECK( dummy.HasKeyInputFocus()); // Also tests IsKeyboardListener() API
-  DALI_TEST_CHECK( dummyImpl.keyInputFocusGained );
+  manager.SetFocus(dummy);
+  DALI_TEST_CHECK(dummy.HasKeyInputFocus()); // Also tests IsKeyboardListener() API
+  DALI_TEST_CHECK(dummyImpl.keyInputFocusGained);
 
   focusedControl = manager.GetCurrentFocusControl();
-  DALI_TEST_CHECK( focusedControl );
-  DALI_TEST_CHECK( focusedControl == dummy );
+  DALI_TEST_CHECK(focusedControl);
+  DALI_TEST_CHECK(focusedControl == dummy);
 
   END_TEST;
 }
@@ -175,97 +174,95 @@ int UtcDaliKeyInputFocusManagerSetFocus01(void)
 int UtcDaliKeyInputFocusManagerSetFocus02(void)
 {
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene     stage = application.GetScene();
 
   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");
 
   KeyInputFocusManager manager = KeyInputFocusManager::Get();
   DALI_TEST_CHECK(manager);
 
-  DummyControl dummy1 = DummyControl::New(true);
+  DummyControl        dummy1     = DummyControl::New(true);
   Impl::DummyControl& dummy1Impl = static_cast<Impl::DummyControl&>(dummy1.GetImplementation());
-  dummy1.SetSize(100.0f, 100.0f);
-  stage.Add( dummy1 );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
-
-  manager.SetFocus( dummy1 );
-  DALI_TEST_CHECK( dummy1.HasKeyInputFocus()); // Also tests IsKeyboardListener() API
-  DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
+  dummy1.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  stage.Add(dummy1);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusLost);
+
+  manager.SetFocus(dummy1);
+  DALI_TEST_CHECK(dummy1.HasKeyInputFocus()); // Also tests IsKeyboardListener() API
+  DALI_TEST_CHECK(dummy1Impl.keyInputFocusGained);
   dummy1Impl.keyInputFocusGained = false;
 
-  DummyControl dummy2 = DummyControl::New(true);
+  DummyControl        dummy2     = DummyControl::New(true);
   Impl::DummyControl& dummy2Impl = static_cast<Impl::DummyControl&>(dummy2.GetImplementation());
-  dummy2.SetSize(100.0f, 100.0f);
-  stage.Add( dummy2 );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
-
-  manager.SetFocus( dummy2 );
-  DALI_TEST_CHECK( dummy2.HasKeyInputFocus()); // Also tests IsKeyboardListener() API
-  DALI_TEST_CHECK( dummy2Impl.keyInputFocusGained );
+  dummy2.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  stage.Add(dummy2);
+  DALI_TEST_CHECK(!dummy2Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusLost);
+
+  manager.SetFocus(dummy2);
+  DALI_TEST_CHECK(dummy2.HasKeyInputFocus()); // Also tests IsKeyboardListener() API
+  DALI_TEST_CHECK(dummy2Impl.keyInputFocusGained);
   dummy1Impl.keyInputFocusGained = false;
 
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(dummy1Impl.keyInputFocusLost);
 
   END_TEST;
 }
 
 int UtcDaliKeyInputFocusManagerKeyEventPropagation01(void)
 {
-
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene     stage = application.GetScene();
 
   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");
 
   KeyInputFocusManager manager = KeyInputFocusManager::Get();
   DALI_TEST_CHECK(manager);
 
-  KeyEventCallback stageCallback( false );
-  stage.KeyEventSignal().Connect( &stageCallback, &KeyEventCallback::Callback );
+  KeyEventCallback stageCallback(false);
+  stage.KeyEventSignal().Connect(&stageCallback, &KeyEventCallback::Callback);
 
   DummyControl dummy1 = DummyControl::New(true);
-  dummy1.SetSize(100.0f, 100.0f);
-  KeyEventCallback callback1( false );
-  dummy1.KeyEventSignal().Connect( &callback1, &KeyEventCallback::Callback );
-  stage.Add( dummy1 );
+  dummy1.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  KeyEventCallback callback1(false);
+  dummy1.KeyEventSignal().Connect(&callback1, &KeyEventCallback::Callback);
+  stage.Add(dummy1);
 
   DummyControl dummy2 = DummyControl::New(true);
-  dummy2.SetSize(100.0f, 100.0f);
-  KeyEventCallback callback2( false );
-  dummy2.KeyEventSignal().Connect( &callback2, &KeyEventCallback::Callback );
-  dummy1.Add( dummy2 );
+  dummy2.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  KeyEventCallback callback2(false);
+  dummy2.KeyEventSignal().Connect(&callback2, &KeyEventCallback::Callback);
+  dummy1.Add(dummy2);
 
-  DummyControl dummy3 = DummyControl::New(true);
+  DummyControl        dummy3     = DummyControl::New(true);
   Impl::DummyControl& dummy3Impl = static_cast<Impl::DummyControl&>(dummy3.GetImplementation());
-  dummy3.SetSize(100.0f, 100.0f);
-  KeyEventCallback callback3( false );
-  dummy3.KeyEventSignal().Connect( &callback3, &KeyEventCallback::Callback );
-  dummy2.Add( dummy3 );
-  DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusLost );
+  dummy3.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  KeyEventCallback callback3(false);
+  dummy3.KeyEventSignal().Connect(&callback3, &KeyEventCallback::Callback);
+  dummy2.Add(dummy3);
+  DALI_TEST_CHECK(!dummy3Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(!dummy3Impl.keyInputFocusLost);
 
-  manager.SetFocus( dummy3 );
-  DALI_TEST_CHECK( dummy3Impl.keyInputFocusGained );
+  manager.SetFocus(dummy3);
+  DALI_TEST_CHECK(dummy3Impl.keyInputFocusGained);
 
-  Integration::KeyEvent event( "a", "a", 0, 0, 0, Integration::KeyEvent::Up, "", DevelDevice::Class::TOUCH, DevelDevice::Subclass::NONE );
+  Integration::KeyEvent event("a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "", "", Device::Class::TOUCH, Device::Subclass::NONE);
   application.ProcessEvent(event);
 
-  DALI_TEST_CHECK( callback1.mIsCalled );
-  DALI_TEST_CHECK( callback2.mIsCalled );
-  DALI_TEST_CHECK( callback3.mIsCalled );
-  DALI_TEST_CHECK( stageCallback.mIsCalled );
+  DALI_TEST_CHECK(callback1.mIsCalled);
+  DALI_TEST_CHECK(callback2.mIsCalled);
+  DALI_TEST_CHECK(callback3.mIsCalled);
+  DALI_TEST_CHECK(stageCallback.mIsCalled);
 
   END_TEST;
 }
 
 int UtcDaliKeyInputFocusManagerKeyEventPropagation02(void)
 {
-
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene     stage = application.GetScene();
 
   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");
 
@@ -273,35 +270,81 @@ int UtcDaliKeyInputFocusManagerKeyEventPropagation02(void)
   DALI_TEST_CHECK(manager);
 
   DummyControl dummy1 = DummyControl::New(true);
-  dummy1.SetSize(100.0f, 100.0f);
-  KeyEventCallback callback1( false );
-  dummy1.KeyEventSignal().Connect( &callback1, &KeyEventCallback::Callback );
-  stage.Add( dummy1 );
+  dummy1.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  KeyEventCallback callback1(false);
+  dummy1.KeyEventSignal().Connect(&callback1, &KeyEventCallback::Callback);
+  stage.Add(dummy1);
 
   DummyControl dummy2 = DummyControl::New(true);
-  dummy2.SetSize(100.0f, 100.0f);
-  KeyEventCallback callback2( true );
-  dummy2.KeyEventSignal().Connect( &callback2, &KeyEventCallback::Callback );
-  dummy1.Add( dummy2 );
+  dummy2.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  KeyEventCallback callback2(true);
+  dummy2.KeyEventSignal().Connect(&callback2, &KeyEventCallback::Callback);
+  dummy1.Add(dummy2);
 
-  DummyControl dummy3 = DummyControl::New(true);
+  DummyControl        dummy3     = DummyControl::New(true);
   Impl::DummyControl& dummy3Impl = static_cast<Impl::DummyControl&>(dummy3.GetImplementation());
-  dummy3.SetSize(100.0f, 100.0f);
-  KeyEventCallback callback3( false );
-  dummy3.KeyEventSignal().Connect( &callback3, &KeyEventCallback::Callback );
-  dummy2.Add( dummy3 );
-  DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusLost );
+  dummy3.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  KeyEventCallback callback3(false);
+  dummy3.KeyEventSignal().Connect(&callback3, &KeyEventCallback::Callback);
+  dummy2.Add(dummy3);
+  DALI_TEST_CHECK(!dummy3Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(!dummy3Impl.keyInputFocusLost);
 
-  manager.SetFocus( dummy3 );
-  DALI_TEST_CHECK( dummy3Impl.keyInputFocusGained );
+  manager.SetFocus(dummy3);
+  DALI_TEST_CHECK(dummy3Impl.keyInputFocusGained);
 
-  Integration::KeyEvent event( "a", "a", 0, 0, 0, Integration::KeyEvent::Up, "", DevelDevice::Class::TOUCH, DevelDevice::Subclass::NONE );
+  Integration::KeyEvent event("a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "", "", Device::Class::TOUCH, Device::Subclass::NONE);
   application.ProcessEvent(event);
 
-  DALI_TEST_CHECK( !callback1.mIsCalled );
-  DALI_TEST_CHECK( callback2.mIsCalled );
-  DALI_TEST_CHECK( callback3.mIsCalled );
+  DALI_TEST_CHECK(!callback1.mIsCalled);
+  DALI_TEST_CHECK(callback2.mIsCalled);
+  DALI_TEST_CHECK(callback3.mIsCalled);
+
+  END_TEST;
+}
+
+int UtcDaliKeyInputFocusManagerDispatchKeyEvents(void)
+{
+  ToolkitTestApplication application;
+  Integration::Scene     stage = application.GetScene();
+
+  tet_infoline("Test KeyEvents propagation. If DISPATCH_KEY_EVENTS property is false, the KeyEvent is also not received.");
+
+  KeyInputFocusManager manager = KeyInputFocusManager::Get();
+  DALI_TEST_CHECK(manager);
+
+  DummyControl dummy1 = DummyControl::New(true);
+  dummy1.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  KeyEventCallback callback1(false);
+  dummy1.KeyEventSignal().Connect(&callback1, &KeyEventCallback::Callback);
+  stage.Add(dummy1);
+
+  DummyControl dummy2 = DummyControl::New(true);
+  dummy2.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  KeyEventCallback callback2(false);
+  dummy2.KeyEventSignal().Connect(&callback2, &KeyEventCallback::Callback);
+  // dummy2 set DISPATCH_KEY_EVENTS property to false.
+  dummy2.SetProperty(Toolkit::DevelControl::Property::DISPATCH_KEY_EVENTS, false);
+  dummy1.Add(dummy2);
+
+  DummyControl        dummy3     = DummyControl::New(true);
+  Impl::DummyControl& dummy3Impl = static_cast<Impl::DummyControl&>(dummy3.GetImplementation());
+  dummy3.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  KeyEventCallback callback3(false);
+  dummy3.KeyEventSignal().Connect(&callback3, &KeyEventCallback::Callback);
+  dummy2.Add(dummy3);
+  DALI_TEST_CHECK(!dummy3Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(!dummy3Impl.keyInputFocusLost);
+
+  manager.SetFocus(dummy3);
+  DALI_TEST_CHECK(dummy3Impl.keyInputFocusGained);
+
+  Integration::KeyEvent event("a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "", "", Device::Class::TOUCH, Device::Subclass::NONE);
+  application.ProcessEvent(event);
+
+  DALI_TEST_CHECK(!callback1.mIsCalled);
+  DALI_TEST_CHECK(!callback2.mIsCalled);
+  DALI_TEST_CHECK(!callback3.mIsCalled);
 
   END_TEST;
 }
@@ -309,81 +352,81 @@ int UtcDaliKeyInputFocusManagerKeyEventPropagation02(void)
 int UtcDaliKeyInputFocusManagerGetCurrentFocusControl(void)
 {
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene     stage = application.GetScene();
 
   tet_infoline(" Add 2 controls, check they each get focused. Re-focus the first control - ensure it's now got focus (check signals)");
 
   KeyInputFocusManager manager = KeyInputFocusManager::Get();
   DALI_TEST_CHECK(manager);
 
-  DummyControl dummy1 = DummyControl::New(true);
+  DummyControl        dummy1     = DummyControl::New(true);
   Impl::DummyControl& dummy1Impl = static_cast<Impl::DummyControl&>(dummy1.GetImplementation());
-  dummy1.SetSize(100.0f, 100.0f);
-  stage.Add( dummy1 );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
+  dummy1.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  stage.Add(dummy1);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusLost);
 
-  DummyControl dummy2 = DummyControl::New(true);
+  DummyControl        dummy2     = DummyControl::New(true);
   Impl::DummyControl& dummy2Impl = static_cast<Impl::DummyControl&>(dummy2.GetImplementation());
-  dummy2.SetSize(100.0f, 100.0f);
-  stage.Add( dummy2 );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
+  dummy2.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  stage.Add(dummy2);
+  DALI_TEST_CHECK(!dummy2Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(!dummy2Impl.keyInputFocusLost);
 
   manager.SetFocus(dummy1);
-  DALI_TEST_CHECK( dummy1 == manager.GetCurrentFocusControl() );
-  DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
+  DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
+  DALI_TEST_CHECK(dummy1Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusLost);
   dummy1Impl.keyInputFocusGained = false;
-  dummy1Impl.keyInputFocusLost = false;
+  dummy1Impl.keyInputFocusLost   = false;
 
   manager.SetFocus(dummy2);
-  DALI_TEST_CHECK( dummy2 == manager.GetCurrentFocusControl() );
-  DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( dummy2Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
+  DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
+  DALI_TEST_CHECK(dummy1Impl.keyInputFocusLost);
+  DALI_TEST_CHECK(dummy2Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(!dummy2Impl.keyInputFocusLost);
   // Reset signal received
   dummy1Impl.keyInputFocusGained = false;
-  dummy1Impl.keyInputFocusLost = false;
+  dummy1Impl.keyInputFocusLost   = false;
   dummy2Impl.keyInputFocusGained = false;
-  dummy2Impl.keyInputFocusLost = false;
+  dummy2Impl.keyInputFocusLost   = false;
 
   manager.SetFocus(dummy1);
-  DALI_TEST_CHECK( dummy1 == manager.GetCurrentFocusControl());
-  DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( dummy2Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
+  DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
+  DALI_TEST_CHECK(dummy1Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(dummy2Impl.keyInputFocusLost);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusLost);
+  DALI_TEST_CHECK(!dummy2Impl.keyInputFocusGained);
   END_TEST;
 }
 
 int UtcDaliKeyInputFocusManagerRemoveFocus(void)
 {
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene     stage = application.GetScene();
 
   tet_infoline(" Add focus controls. Test that removing focus from control which has focus. ");
 
   KeyInputFocusManager manager = KeyInputFocusManager::Get();
   DALI_TEST_CHECK(manager);
 
-  DummyControl dummy1 = DummyControl::New(true);
+  DummyControl        dummy1     = DummyControl::New(true);
   Impl::DummyControl& dummy1Impl = static_cast<Impl::DummyControl&>(dummy1.GetImplementation());
-  dummy1.SetSize(100.0f, 100.0f);
-  stage.Add( dummy1 );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
+  dummy1.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  stage.Add(dummy1);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusLost);
 
   manager.SetFocus(dummy1);
   DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
   dummy1Impl.keyInputFocusGained = false;
-  dummy1Impl.keyInputFocusLost = false;
+  dummy1Impl.keyInputFocusLost   = false;
 
   manager.RemoveFocus(dummy1);
   DALI_TEST_CHECK(Control() == manager.GetCurrentFocusControl());
-  DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
+  DALI_TEST_CHECK(dummy1Impl.keyInputFocusLost);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusGained);
 
   END_TEST;
 }
@@ -391,42 +434,117 @@ int UtcDaliKeyInputFocusManagerRemoveFocus(void)
 int UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged(void)
 {
   ToolkitTestApplication application;
-  KeyInputFocusManager manager = KeyInputFocusManager::Get();
-  Stage stage = Stage::GetCurrent();
+  KeyInputFocusManager   manager = KeyInputFocusManager::Get();
+  Integration::Scene     stage   = application.GetScene();
 
   tet_infoline(" UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged");
 
   PushButton pushButton1 = PushButton::New();
   PushButton pushButton2 = PushButton::New();
 
-  stage.Add( pushButton1 );
-  stage.Add( pushButton2 );
+  stage.Add(pushButton1);
+  stage.Add(pushButton2);
 
-  PushButton gainActor, lostActor;
-  KeyInputFocusChangedCallback callback( gainActor, lostActor );
-  manager.KeyInputFocusChangedSignal().Connect( &callback, &KeyInputFocusChangedCallback::Callback );
+  PushButton                   gainActor, lostActor;
+  KeyInputFocusChangedCallback callback(gainActor, lostActor);
+  manager.KeyInputFocusChangedSignal().Connect(&callback, &KeyInputFocusChangedCallback::Callback);
 
   manager.SetFocus(pushButton1);
 
-  DALI_TEST_CHECK( gainActor == pushButton1 );
-  DALI_TEST_CHECK( lostActor == Control() );
+  DALI_TEST_CHECK(gainActor == pushButton1);
+  DALI_TEST_CHECK(lostActor == Control());
 
   gainActor.Reset();
   lostActor.Reset();
 
   manager.SetFocus(pushButton2);
 
-  DALI_TEST_CHECK( gainActor == pushButton2 );
-  DALI_TEST_CHECK( lostActor == pushButton1 );
+  DALI_TEST_CHECK(gainActor == pushButton2);
+  DALI_TEST_CHECK(lostActor == pushButton1);
 
   gainActor.Reset();
   lostActor.Reset();
 
   // Removing the focus actor from the stage would also result in signal emission.
-  stage.Remove( pushButton1 );
-  stage.Remove( pushButton2 );
+  stage.Remove(pushButton1);
+  stage.Remove(pushButton2);
+
+  DALI_TEST_CHECK(gainActor == Control());
+  DALI_TEST_CHECK(lostActor == Control());
+  END_TEST;
+}
+
+int UtcDaliKeyInputFocusManagerSignalKeyInputFocusChangedforNewWindow(void)
+{
+  ToolkitTestApplication application;
+  KeyInputFocusManager   manager = KeyInputFocusManager::Get();
+
+  tet_infoline(" UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged");
+
+  PushButton pushButton1 = PushButton::New();
+  PushButton pushButton2 = PushButton::New();
+
+  Window window = Window::New(PositionSize(0, 0, 0, 0), "", false);
+  DALI_TEST_CHECK(window);
+
+  window.Add(pushButton1);
+  window.Add(pushButton2);
+
+  PushButton                   gainActor, lostActor;
+  KeyInputFocusChangedCallback callback(gainActor, lostActor);
+  manager.KeyInputFocusChangedSignal().Connect(&callback, &KeyInputFocusChangedCallback::Callback);
+
+  manager.SetFocus(pushButton1);
+
+  DALI_TEST_CHECK(gainActor == pushButton1);
+  DALI_TEST_CHECK(lostActor == Control());
+
+  gainActor.Reset();
+  lostActor.Reset();
+
+  manager.SetFocus(pushButton2);
+
+  DALI_TEST_CHECK(gainActor == pushButton2);
+  DALI_TEST_CHECK(lostActor == pushButton1);
+
+  gainActor.Reset();
+  lostActor.Reset();
+
+  // Removing the focus actor from the window would also result in signal emission.
+  window.Remove(pushButton1);
+  window.Remove(pushButton2);
+  DALI_TEST_CHECK(gainActor == Control());
+  DALI_TEST_CHECK(lostActor == Control());
+
+  window.Reset();
+  END_TEST;
+}
+
+int UtcDaliKeyInputFocusManagerKeyEventOtherWindow(void)
+{
+  ToolkitTestApplication application;
+
+  tet_infoline(" UtcDaliKeyInputFocusManagerSignalKeyEventOtherWindow");
+
+  Dali::Integration::Scene scene = application.GetScene();
+
+  KeyInputFocusManager   manager = KeyInputFocusManager::Get();
+  DALI_TEST_CHECK(manager);
+
+  PushButton pushButton1 = PushButton::New();
+  scene.Add(pushButton1);
+
+  KeyEventCallback windowCallback(false);
+  pushButton1.KeyEventSignal().Connect(&windowCallback, &KeyEventCallback::Callback);
+
+  manager.SetFocus(pushButton1);
+
+  Integration::KeyEvent event("a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "", "", Device::Class::TOUCH, Device::Subclass::NONE);
+  event.windowId = 3;
+
+  application.ProcessEvent(event);
+
+  DALI_TEST_CHECK(!windowCallback.mIsCalled);
 
-  DALI_TEST_CHECK( gainActor == Control() );
-  DALI_TEST_CHECK( lostActor == Control() );
   END_TEST;
 }