[dali_2.3.19] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-KeyInputFocusManager.cpp
index be76927..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-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"
 
@@ -28,7 +31,6 @@ using namespace Toolkit;
 
 namespace
 {
-
 /**
  * Callback class for KeyInputFocusChanged signal.
  */
@@ -40,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;
@@ -61,37 +63,49 @@ 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;
 };
 
 /**
- * Callback class to test SignalUnhandledKeyEvent signal
+ * Callback class for KeyEvent signal of control.
  */
-class SignalUnhandledKeyEventCallback : public Dali::ConnectionTracker
+class KeyEventCallback : public Dali::ConnectionTracker
 {
 public:
-  SignalUnhandledKeyEventCallback( SignalData& data ) : mSignalData( data ) { }
+  /**
+   * Constructor
+   * @param[in]  returnValue  Set return value of KeyEvent callback.
+   * */
+  KeyEventCallback(bool consumed)
+  : mConsumed(consumed),
+    mIsCalled(false)
+  {
+  }
+
+  bool Callback(Control control, const KeyEvent& keyEvent)
+  {
+    mIsCalled = true;
+    return mConsumed;
+  }
 
-  void Callback(const KeyEvent& event)
+  void Callback(const KeyEvent& keyEvent)
   {
-    mSignalData.functorCalled = true;
-    mSignalData.receivedKeyEvent = event;
+    mIsCalled = true;
   }
 
-  SignalData& mSignalData;
+  bool mConsumed;
+  bool mIsCalled;
 };
 
 } // namespace
@@ -123,35 +137,36 @@ 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. Add a control to the stack. Check it is now the focused actor and receives KeyInputFocusGained signal");
+  tet_infoline(" Check that there is no focused control. Set focus to control. Check it is now the focused actor and receives KeyInputFocusGained signal");
 
   KeyInputFocusManager manager = KeyInputFocusManager::Get();
   DALI_TEST_CHECK(manager);
 
   Control focusedControl = manager.GetCurrentFocusControl();
-  DALI_TEST_CHECK( ! focusedControl );
+  DALI_TEST_CHECK(!focusedControl);
 
-  DummyControl dummy = DummyControl::New(true);
-  DummyControlImplOverride& dummyImpl = static_cast<DummyControlImplOverride&>(dummy.GetImplementation());
-  dummy.SetSize(100.0f, 100.0f);
-  stage.Add( dummy );
-  DALI_TEST_CHECK( ! dummyImpl.keyInputFocusGained );
+  DummyControl        dummy     = DummyControl::New(true);
+  Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummy.GetImplementation());
+  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;
 }
@@ -159,515 +174,377 @@ int UtcDaliKeyInputFocusManagerSetFocus01(void)
 int UtcDaliKeyInputFocusManagerSetFocus02(void)
 {
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene     stage = application.GetScene();
 
-  tet_infoline(" Add a control to the stack. Check it is now the focused actor and receives KeyInputFocusGained signal. Add another control - check that the first control receives KeyInputFocusLost");
+  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);
-  DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(dummy1.GetImplementation());
-  dummy1.SetSize(100.0f, 100.0f);
-  stage.Add( dummy1 );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
-
-  stage.Add( dummy1 );
+  DummyControl        dummy1     = DummyControl::New(true);
+  Impl::DummyControl& dummy1Impl = static_cast<Impl::DummyControl&>(dummy1.GetImplementation());
+  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 );
+  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);
-  DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
-  dummy2.SetSize(100.0f, 100.0f);
-  stage.Add( dummy2 );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
-
-  stage.Add( dummy2 );
+  DummyControl        dummy2     = DummyControl::New(true);
+  Impl::DummyControl& dummy2Impl = static_cast<Impl::DummyControl&>(dummy2.GetImplementation());
+  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 );
+  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 UtcDaliKeyInputFocusManagerGetCurrentFocusControl(void)
+int UtcDaliKeyInputFocusManagerKeyEventPropagation01(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)");
+  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);
+
   DummyControl dummy1 = DummyControl::New(true);
-  DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(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));
+  KeyEventCallback callback1(false);
+  dummy1.KeyEventSignal().Connect(&callback1, &KeyEventCallback::Callback);
+  stage.Add(dummy1);
 
   DummyControl dummy2 = DummyControl::New(true);
-  DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(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));
+  KeyEventCallback callback2(false);
+  dummy2.KeyEventSignal().Connect(&callback2, &KeyEventCallback::Callback);
+  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(dummy1);
-  DALI_TEST_CHECK( dummy1 == manager.GetCurrentFocusControl() );
-  DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
-  dummy1Impl.keyInputFocusGained = false;
-  dummy1Impl.keyInputFocusLost = false;
+  manager.SetFocus(dummy3);
+  DALI_TEST_CHECK(dummy3Impl.keyInputFocusGained);
 
-  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 );
-  // Reset signal received
-  dummy1Impl.keyInputFocusGained = false;
-  dummy1Impl.keyInputFocusLost = false;
-  dummy2Impl.keyInputFocusGained = false;
-  dummy2Impl.keyInputFocusLost = false;
+  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);
 
-  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 );
   END_TEST;
 }
 
-int UtcDaliKeyInputFocusManagerRemoveFocus01(void)
+int UtcDaliKeyInputFocusManagerKeyEventPropagation02(void)
 {
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene     stage = application.GetScene();
 
-  tet_infoline(" Add 3 focus controls. Test that removing the topmost informs the next control that it now has focus, Test that the bottommost control doesn't receive anything. ");
+  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");
 
   KeyInputFocusManager manager = KeyInputFocusManager::Get();
   DALI_TEST_CHECK(manager);
 
   DummyControl dummy1 = DummyControl::New(true);
-  DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(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));
+  KeyEventCallback callback1(false);
+  dummy1.KeyEventSignal().Connect(&callback1, &KeyEventCallback::Callback);
+  stage.Add(dummy1);
 
   DummyControl dummy2 = DummyControl::New(true);
-  DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
-  dummy2.SetSize(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());
+  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);
+  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(dummy2);
-  DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
-  dummy1Impl.keyInputFocusGained = false;
-  dummy1Impl.keyInputFocusLost = false;
-  dummy2Impl.keyInputFocusGained = false;
-  dummy2Impl.keyInputFocusLost = false;
+  manager.SetFocus(dummy3);
+  DALI_TEST_CHECK(dummy3Impl.keyInputFocusGained);
 
-  manager.RemoveFocus(dummy2);
-  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 );
-  dummy1Impl.keyInputFocusGained = false;
-  dummy1Impl.keyInputFocusLost = false;
-  dummy2Impl.keyInputFocusGained = false;
-  dummy2Impl.keyInputFocusLost = false;
+  Integration::KeyEvent event("a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "", "", Device::Class::TOUCH, Device::Subclass::NONE);
+  application.ProcessEvent(event);
 
-  manager.RemoveFocus(dummy1);
-  DALI_TEST_CHECK(Control() == manager.GetCurrentFocusControl());
-  DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
+  DALI_TEST_CHECK(!callback1.mIsCalled);
+  DALI_TEST_CHECK(callback2.mIsCalled);
+  DALI_TEST_CHECK(callback3.mIsCalled);
 
   END_TEST;
 }
 
-int UtcDaliKeyInputFocusManagerRemoveFocus02(void)
+int UtcDaliKeyInputFocusManagerDispatchKeyEvents(void)
 {
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene     stage = application.GetScene();
 
-  tet_infoline(" Add 3 focus controls. Test that removing the bottommost doesn't change the focused control" );
+  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);
-  DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(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));
+  KeyEventCallback callback1(false);
+  dummy1.KeyEventSignal().Connect(&callback1, &KeyEventCallback::Callback);
+  stage.Add(dummy1);
 
   DummyControl dummy2 = DummyControl::New(true);
-  DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
-  dummy2.SetSize(100.0f, 100.0f);
-  stage.Add( dummy2 );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
-
-  DummyControl dummy3 = DummyControl::New(true);
-  DummyControlImplOverride& dummy3Impl = static_cast<DummyControlImplOverride&>(dummy3.GetImplementation());
-  dummy3.SetSize(100.0f, 100.0f);
-  stage.Add( dummy3 );
-  DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusLost );
-
-  manager.SetFocus(dummy1);
-  DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
-
-  manager.SetFocus(dummy2);
-  DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
+  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(dummy3 == manager.GetCurrentFocusControl());
-  dummy1Impl.keyInputFocusGained = false;
-  dummy1Impl.keyInputFocusLost = false;
-  dummy2Impl.keyInputFocusGained = false;
-  dummy2Impl.keyInputFocusLost = false;
-  dummy3Impl.keyInputFocusGained = false;
-  dummy3Impl.keyInputFocusLost = false;
+  DALI_TEST_CHECK(dummy3Impl.keyInputFocusGained);
 
-  manager.RemoveFocus(dummy1);
-  DALI_TEST_CHECK(dummy3 == manager.GetCurrentFocusControl());
-  DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusGained );
-  dummy1Impl.keyInputFocusGained = false;
-  dummy1Impl.keyInputFocusLost = false;
-  dummy2Impl.keyInputFocusGained = false;
-  dummy2Impl.keyInputFocusLost = false;
-  dummy3Impl.keyInputFocusGained = false;
-  dummy3Impl.keyInputFocusLost = false;
+  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;
 }
 
-int UtcDaliKeyInputFocusManagerRemoveFocus03(void)
+int UtcDaliKeyInputFocusManagerGetCurrentFocusControl(void)
 {
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene     stage = application.GetScene();
 
-  tet_infoline(" Add 2 focus controls. Remove each of them from the bottom up. Test that the stack is now empty. Add a new control - check that it correctly has focus" );
+  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);
-  DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(dummy1.GetImplementation());
-  dummy1.SetSize(100.0f, 100.0f);
-  stage.Add( dummy1 );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
+  DummyControl        dummy1     = DummyControl::New(true);
+  Impl::DummyControl& dummy1Impl = static_cast<Impl::DummyControl&>(dummy1.GetImplementation());
+  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);
-  DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
-  dummy2.SetSize(100.0f, 100.0f);
-  stage.Add( dummy2 );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
+  DummyControl        dummy2     = DummyControl::New(true);
+  Impl::DummyControl& dummy2Impl = static_cast<Impl::DummyControl&>(dummy2.GetImplementation());
+  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());
-
-  manager.SetFocus(dummy2);
-  DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
-
+  DALI_TEST_CHECK(dummy1Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusLost);
   dummy1Impl.keyInputFocusGained = false;
-  dummy1Impl.keyInputFocusLost = false;
-  dummy2Impl.keyInputFocusGained = false;
-  dummy2Impl.keyInputFocusLost = false;
+  dummy1Impl.keyInputFocusLost   = false;
 
-  manager.RemoveFocus(dummy1);
+  manager.SetFocus(dummy2);
   DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
-  DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
-  dummy1Impl.keyInputFocusGained = false;
-  dummy1Impl.keyInputFocusLost = false;
-  dummy2Impl.keyInputFocusGained = false;
-  dummy2Impl.keyInputFocusLost = false;
-
-  manager.RemoveFocus(dummy2);
-  DALI_TEST_CHECK(Control() == manager.GetCurrentFocusControl());
-  DALI_TEST_CHECK( dummy2Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
+  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;
-
-  PushButton pushButton1 = PushButton::New();
-  stage.Add( pushButton1 );
-  manager.SetFocus( pushButton1 );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
-  DALI_TEST_CHECK( pushButton1 == manager.GetCurrentFocusControl());
-  END_TEST;
-}
-
-int UtcDaliKeyInputFocusManagerRemoveFocus04(void)
-{
-  ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
-
-  tet_infoline(" Test what happens if the removed control is not on the focus stack");
-  KeyInputFocusManager manager = KeyInputFocusManager::Get();
-  DALI_TEST_CHECK(manager);
-
-  PushButton pushButton1 = PushButton::New();
-  PushButton pushButton2 = PushButton::New();
-  stage.Add( pushButton1 );
-  stage.Add( pushButton2 );
-  manager.SetFocus( pushButton1 );
-  manager.SetFocus( pushButton2 );
-
-  PushButton pushButton3 = PushButton::New();
-  stage.Add( pushButton3 );
-  manager.RemoveFocus( pushButton3 );
-  DALI_TEST_CHECK( pushButton2 == manager.GetCurrentFocusControl());
-  END_TEST;
-}
-
-int UtcDaliKeyInputFocusManagerDestroyObject01(void)
-{
-  ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
-
-  tet_infoline(" Add 2 controls to the stack. Unparent and destroy the topmost. Check that it is removed from the stack, and that the bottommost is correctly focused" );
-
-  KeyInputFocusManager manager = KeyInputFocusManager::Get();
-  DALI_TEST_CHECK(manager);
-
-  DummyControl dummy1 = DummyControl::New(true);
-  DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(dummy1.GetImplementation());
-  dummy1.SetSize(100.0f, 100.0f);
-  stage.Add( dummy1 );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
-
-  {
-    DummyControl dummy2 = DummyControl::New(true);
-    DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
-    dummy2.SetSize(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());
-
-    manager.SetFocus(dummy2);
-    DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
-
-    dummy1Impl.keyInputFocusGained = false;
-    dummy1Impl.keyInputFocusLost = false;
-    dummy2Impl.keyInputFocusGained = false;
-    dummy2Impl.keyInputFocusLost = false;
-
-    stage.Remove(dummy2);
-  }
+  dummy2Impl.keyInputFocusLost   = false;
 
+  manager.SetFocus(dummy1);
   DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
-  DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
+  DALI_TEST_CHECK(dummy1Impl.keyInputFocusGained);
+  DALI_TEST_CHECK(dummy2Impl.keyInputFocusLost);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusLost);
+  DALI_TEST_CHECK(!dummy2Impl.keyInputFocusGained);
   END_TEST;
 }
 
-int UtcDaliKeyInputFocusManagerDestroyObject02(void)
+int UtcDaliKeyInputFocusManagerRemoveFocus(void)
 {
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene     stage = application.GetScene();
 
-  tet_infoline(" Add 2 controls to the stack. Destroy a different actor entirely. Check that the stack is un-affected.");
+  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);
-  DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(dummy1.GetImplementation());
-  dummy1.SetSize(100.0f, 100.0f);
-  stage.Add( dummy1 );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
-
-
-  DummyControl dummy2 = DummyControl::New(true);
-  DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
-  dummy2.SetSize(100.0f, 100.0f);
-  stage.Add( dummy2 );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
-  DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
+  DummyControl        dummy1     = DummyControl::New(true);
+  Impl::DummyControl& dummy1Impl = static_cast<Impl::DummyControl&>(dummy1.GetImplementation());
+  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());
-
-  manager.SetFocus(dummy2);
-  DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
-
   dummy1Impl.keyInputFocusGained = false;
-  dummy1Impl.keyInputFocusLost = false;
-  dummy2Impl.keyInputFocusGained = false;
-  dummy2Impl.keyInputFocusLost = false;
-
-  {
-    BitmapImage image = CreateBitmapImage();
-    ImageActor imageActor = ImageActor::New( image );
-    stage.Add( imageActor );
-    imageActor.SetSize(100, 100);
+  dummy1Impl.keyInputFocusLost   = false;
 
-    application.SendNotification();
-    application.Render();
-
-    stage.Remove( imageActor );
-  }
+  manager.RemoveFocus(dummy1);
+  DALI_TEST_CHECK(Control() == manager.GetCurrentFocusControl());
+  DALI_TEST_CHECK(dummy1Impl.keyInputFocusLost);
+  DALI_TEST_CHECK(!dummy1Impl.keyInputFocusGained);
 
-  DALI_TEST_CHECK( dummy2 == manager.GetCurrentFocusControl());
   END_TEST;
 }
 
-int UtcDaliKeyInputFocusManagerIsKeyboardListener(void)
+int UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged(void)
 {
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  KeyInputFocusManager   manager = KeyInputFocusManager::Get();
+  Integration::Scene     stage   = application.GetScene();
 
-  tet_infoline(" UtcDaliKeyInputFocusManagerIsKeyboardListener");
-
-  KeyInputFocusManager manager = KeyInputFocusManager::Get();
-  DALI_TEST_CHECK(manager);
+  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);
 
   manager.SetFocus(pushButton1);
-  DALI_TEST_CHECK(pushButton1 == manager.GetCurrentFocusControl());
+
+  DALI_TEST_CHECK(gainActor == pushButton1);
+  DALI_TEST_CHECK(lostActor == Control());
+
+  gainActor.Reset();
+  lostActor.Reset();
 
   manager.SetFocus(pushButton2);
-  DALI_TEST_CHECK(pushButton2 == manager.GetCurrentFocusControl());
 
-  DALI_TEST_CHECK(manager.IsKeyboardListener(pushButton1));
-  DALI_TEST_CHECK(manager.IsKeyboardListener(pushButton2));
+  DALI_TEST_CHECK(gainActor == pushButton2);
+  DALI_TEST_CHECK(lostActor == pushButton1);
 
-  manager.RemoveFocus(pushButton2);
-  DALI_TEST_CHECK(!manager.IsKeyboardListener(pushButton2));
+  gainActor.Reset();
+  lostActor.Reset();
 
-  manager.RemoveFocus(pushButton1);
-  DALI_TEST_CHECK(!manager.IsKeyboardListener(pushButton1));
+  // Removing the focus actor from the stage would also result in signal emission.
+  stage.Remove(pushButton1);
+  stage.Remove(pushButton2);
 
-  manager.SetFocus(pushButton2);
-  DALI_TEST_CHECK(manager.IsKeyboardListener(pushButton2));
-  pushButton2.ClearKeyInputFocus();
-  DALI_TEST_CHECK(!manager.IsKeyboardListener(pushButton2));
+  DALI_TEST_CHECK(gainActor == Control());
+  DALI_TEST_CHECK(lostActor == Control());
   END_TEST;
 }
 
-int UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged(void)
+int UtcDaliKeyInputFocusManagerSignalKeyInputFocusChangedforNewWindow(void)
 {
   ToolkitTestApplication application;
-  KeyInputFocusManager manager = KeyInputFocusManager::Get();
-  Stage stage = Stage::GetCurrent();
+  KeyInputFocusManager   manager = KeyInputFocusManager::Get();
 
   tet_infoline(" UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged");
 
   PushButton pushButton1 = PushButton::New();
   PushButton pushButton2 = PushButton::New();
 
-  stage.Add( pushButton1 );
-  stage.Add( pushButton2 );
+  Window window = Window::New(PositionSize(0, 0, 0, 0), "", false);
+  DALI_TEST_CHECK(window);
 
-  PushButton gainActor, lostActor;
-  KeyInputFocusChangedCallback callback( gainActor, lostActor );
-  manager.KeyInputFocusChangedSignal().Connect( &callback, &KeyInputFocusChangedCallback::Callback );
+  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() );
+  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 );
+  // 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());
 
-  DALI_TEST_CHECK( gainActor == Control() );
-  DALI_TEST_CHECK( lostActor == Control() );
+  window.Reset();
   END_TEST;
 }
 
-int UtcDaliKeyInputFocusManagerSignalUnhandledKeyEvent(void)
+int UtcDaliKeyInputFocusManagerKeyEventOtherWindow(void)
 {
   ToolkitTestApplication application;
 
-  tet_infoline("UtcDaliKeyInputFocusManagerSignalUnhandledKeyEvent");
+  tet_infoline(" UtcDaliKeyInputFocusManagerSignalKeyEventOtherWindow");
 
-  SignalData data;
-  SignalUnhandledKeyEventCallback callback( data );
+  Dali::Integration::Scene scene = application.GetScene();
 
-  KeyInputFocusManager manager = KeyInputFocusManager::Get();
-  manager.UnhandledKeyEventSignal().Connect( &callback, &SignalUnhandledKeyEventCallback::Callback );
+  KeyInputFocusManager   manager = KeyInputFocusManager::Get();
+  DALI_TEST_CHECK(manager);
 
+  PushButton pushButton1 = PushButton::New();
+  scene.Add(pushButton1);
 
-  Integration::KeyEvent event("a", "a", 0, 0, 0, Integration::KeyEvent::Up);
-  application.ProcessEvent(event);
+  KeyEventCallback windowCallback(false);
+  pushButton1.KeyEventSignal().Connect(&windowCallback, &KeyEventCallback::Callback);
+
+  manager.SetFocus(pushButton1);
 
-  DALI_TEST_CHECK(data.functorCalled);
-  DALI_TEST_CHECK(event.keyName == data.receivedKeyEvent.keyPressedName );
-  DALI_TEST_CHECK(event.keyCode == data.receivedKeyEvent.keyCode);
-  DALI_TEST_CHECK(event.keyString == data.receivedKeyEvent.keyPressed );
-  DALI_TEST_CHECK(event.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
+  Integration::KeyEvent event("a", "", "a", 0, 0, 0, Integration::KeyEvent::UP, "", "", Device::Class::TOUCH, Device::Subclass::NONE);
+  event.windowId = 3;
 
-  data.Reset();
+  application.ProcessEvent(event);
 
-  Integration::KeyEvent event2("v", "v", 0, 0, 0, Integration::KeyEvent::Up);
-  application.ProcessEvent(event2);
+  DALI_TEST_CHECK(!windowCallback.mIsCalled);
 
-  DALI_TEST_CHECK(data.functorCalled);
-  DALI_TEST_CHECK(event2.keyName == data.receivedKeyEvent.keyPressedName );
-  DALI_TEST_CHECK(event2.keyCode == data.receivedKeyEvent.keyCode);
-  DALI_TEST_CHECK(event2.keyString == data.receivedKeyEvent.keyPressed );
   END_TEST;
 }