Merge "Add deviceName to GetNextFocusableView() in CustomFocusAlgorithm." into devel...
authorjoogab yun <joogab.yun@samsung.com>
Mon, 21 Mar 2022 00:57:21 +0000 (00:57 +0000)
committerGerrit Code Review <gerrit@review>
Mon, 21 Mar 2022 00:57:21 +0000 (00:57 +0000)
1  2 
automated-tests/src/dali-toolkit/utc-Dali-KeyboardFocusManager.cpp
dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp

@@@ -55,11 -55,12 +55,12 @@@ public
    : mInterfaceVerified(interfaceVerified),
      mCurrentFocusedActor(),
      mProposedActorToFocus(),
-     mDirection(Control::KeyboardFocus::LEFT)
+     mDirection(Control::KeyboardFocus::LEFT),
+     mDeviceName("")
    {
    }
  
-   Actor GetNextFocusableActor(Actor currentFocusedActor, Actor proposedActorToFocus, Control::KeyboardFocus::Direction direction)
+   Actor GetNextFocusableActor(Actor currentFocusedActor, Actor proposedActorToFocus, Control::KeyboardFocus::Direction direction, const std::string& deviceName)
    {
      tet_infoline("Verifying CustomAlgorithm()");
  
@@@ -68,6 -69,7 +69,7 @@@
      mCurrentFocusedActor  = currentFocusedActor;
      mProposedActorToFocus = proposedActorToFocus;
      mDirection            = direction;
+     mDeviceName           = deviceName;
  
      return mProposedActorToFocus;
    }
      mCurrentFocusedActor  = Actor();
      mProposedActorToFocus = Actor();
      mDirection            = Control::KeyboardFocus::LEFT;
+     mDeviceName           = "";
    }
  
    bool&                             mInterfaceVerified;
    Actor                             mCurrentFocusedActor;
    Actor                             mProposedActorToFocus;
    Control::KeyboardFocus::Direction mDirection;
+   std::string mDeviceName;
  };
  
  // Functors to test whether PreFocusChange signal is emitted when the keyboard focus is about to change
@@@ -578,17 -582,19 +582,19 @@@ int UtcDaliKeyboardFocusManagerCustomAl
    preFocusChangeCallback.Reset();
  
    bool            customAlgorithmInterfaceVerified = false;
+   std::string     deviceName                       = "deviceName";
    CustomAlgorithm customAlgorithm(customAlgorithmInterfaceVerified);
    Toolkit::DevelKeyboardFocusManager::SetCustomAlgorithm(manager, customAlgorithm);
  
    // Move the focus towards right
-   DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == false);
+   DALI_TEST_CHECK(Toolkit::DevelKeyboardFocusManager::MoveFocus(manager, Control::KeyboardFocus::RIGHT, deviceName) == false);
  
    // Because no layout control in the stage and the first actor is focused, it should invoke CustomAlgorithm
    DALI_TEST_CHECK(customAlgorithm.mInterfaceVerified);
    DALI_TEST_CHECK(customAlgorithm.mCurrentFocusedActor == Actor());
    DALI_TEST_CHECK(customAlgorithm.mProposedActorToFocus == Actor());
    DALI_TEST_CHECK(customAlgorithm.mDirection == Control::KeyboardFocus::RIGHT);
+   DALI_TEST_EQUALS(customAlgorithm.mDeviceName, deviceName, TEST_LOCATION );
    customAlgorithm.Reset();
  
    // Check that the focus is set on the first actor
    focusChangedCallback.Reset();
  
    // Move the focus towards right
-   DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == false);
+   DALI_TEST_CHECK(Toolkit::DevelKeyboardFocusManager::MoveFocus(manager, Control::KeyboardFocus::RIGHT, deviceName) == false);
  
    // Because no layout control in the stage and the first actor is focused, it should invoke CustomAlgorithm
    DALI_TEST_CHECK(customAlgorithm.mInterfaceVerified);
    DALI_TEST_CHECK(customAlgorithm.mCurrentFocusedActor == first);
    DALI_TEST_CHECK(customAlgorithm.mProposedActorToFocus == Actor());
    DALI_TEST_CHECK(customAlgorithm.mDirection == Control::KeyboardFocus::RIGHT);
+   DALI_TEST_EQUALS(customAlgorithm.mDeviceName, deviceName, TEST_LOCATION );
    customAlgorithm.Reset();
  
    // Check that the focus is set on the second actor
    focusChangedCallback.Reset();
  
    // Move the focus towards up
-   DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::UP) == false);
+   DALI_TEST_CHECK(Toolkit::DevelKeyboardFocusManager::MoveFocus(manager, Control::KeyboardFocus::UP, deviceName) == false);
  
    // Because no layout control in the stage and no actor is focused, it should invoke CustomAlgorithm
    DALI_TEST_CHECK(customAlgorithm.mInterfaceVerified);
    DALI_TEST_CHECK(customAlgorithm.mCurrentFocusedActor == second);
    DALI_TEST_CHECK(customAlgorithm.mProposedActorToFocus == Actor());
    DALI_TEST_CHECK(customAlgorithm.mDirection == Control::KeyboardFocus::UP);
+   DALI_TEST_EQUALS(customAlgorithm.mDeviceName, deviceName, TEST_LOCATION );
    customAlgorithm.Reset();
    DALI_TEST_CHECK(!focusChangedCallback.mSignalVerified);
  
@@@ -1959,8 -1967,6 +1967,8 @@@ int UtcDaliKeyboardFocusManagerEnableDe
    // button1 -- button2
    button1.SetProperty(Actor::Property::POSITION, Vector2(0.0f, 0.0f));
    button2.SetProperty(Actor::Property::POSITION, Vector2(100.0f, 0.0f));
 +  button1.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
 +  button2.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
  
    // flush the queue and render once
    application.SendNotification();
    // Move the focus towards left, The focus move will success because the default algorithm is enabled.
    // [button1] -- button2
    DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::LEFT) == true);
 -  // Confirm whether focus is moved to button2
 +  // Confirm whether focus is moved to button1
    DALI_TEST_EQUALS(button1.GetProperty<int>(DevelControl::Property::STATE), (int)DevelControl::FOCUSED, TEST_LOCATION);
    DALI_TEST_CHECK(focusChangedCallback.mSignalVerified);
    DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == button2);
    DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == button1);
    focusChangedCallback.Reset();
  
 +  // Clears focus.
 +  manager.ClearFocus();
 +  // There is no actor focused.
 +  // button1 -- button2
 +  DALI_TEST_CHECK(manager.GetCurrentFocusActor() == Actor());
 +
 +  // Move the focus towards right, The focus is on the actor closest to the top left of the window.
 +  // [button1] -- button2
 +  DALI_TEST_CHECK(manager.MoveFocus(Control::KeyboardFocus::RIGHT) == true);
 +
 +  // Confirm whether focus is moved to button1
 +  DALI_TEST_EQUALS(button1.GetProperty<int>(DevelControl::Property::STATE), (int)DevelControl::FOCUSED, TEST_LOCATION);
 +  DALI_TEST_CHECK(focusChangedCallback.mSignalVerified);
 +  DALI_TEST_CHECK(focusChangedCallback.mOriginalFocusedActor == Actor());
 +  DALI_TEST_CHECK(focusChangedCallback.mCurrentFocusedActor == button1);
 +  focusChangedCallback.Reset();
 +
 +
    END_TEST;
  }
  
@@@ -420,7 -420,7 +420,7 @@@ Toolkit::Control KeyboardFocusManager::
    return Toolkit::Control::DownCast(parent);
  }
  
- bool KeyboardFocusManager::MoveFocus(Toolkit::Control::KeyboardFocus::Direction direction)
+ bool KeyboardFocusManager::MoveFocus(Toolkit::Control::KeyboardFocus::Direction direction, const std::string& deviceName)
  {
    Actor currentFocusActor = GetCurrentFocusActor();
  
        if(mCustomAlgorithmInterface)
        {
          mIsWaitingKeyboardFocusChangeCommit = true;
-         nextFocusableActor                  = mCustomAlgorithmInterface->GetNextFocusableActor(currentFocusActor, Actor(), direction);
+         nextFocusableActor                  = mCustomAlgorithmInterface->GetNextFocusableActor(currentFocusActor, Actor(), direction, deviceName);
          mIsWaitingKeyboardFocusChangeCommit = false;
        }
        else if(!mPreFocusChangeSignal.Empty())
          nextFocusableActor                  = mPreFocusChangeSignal.Emit(currentFocusActor, Actor(), direction);
          mIsWaitingKeyboardFocusChangeCommit = false;
        }
 -      else if(mEnableDefaultAlgorithm && currentFocusActor)
 +      else if (mEnableDefaultAlgorithm)
        {
 -        // We should find it among the actors nearby.
 -        Integration::SceneHolder window = Integration::SceneHolder::Get(currentFocusActor);
 -        if(window)
 +        Layer rootLayer;
 +        if (currentFocusActor)
          {
 -          nextFocusableActor = Toolkit::FocusFinder::GetNearestFocusableActor(window.GetRootLayer(), currentFocusActor, direction);
 +          // Find the window of the focused actor.
 +          Integration::SceneHolder window = Integration::SceneHolder::Get(currentFocusActor);
 +          if (window)
 +          {
 +            rootLayer = window.GetRootLayer();
 +          }
 +        }
 +        else
 +        {
 +          // Searches from the currently focused window.
 +          rootLayer = mCurrentFocusedWindow.GetHandle();
 +        }
 +        if (rootLayer)
 +        {
 +          // We should find it among the actors nearby.
 +          nextFocusableActor = Toolkit::FocusFinder::GetNearestFocusableActor(rootLayer, currentFocusActor, direction);
          }
        }
      }
@@@ -785,7 -771,8 +785,8 @@@ Actor KeyboardFocusManager::GetFocusInd
  
  void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event)
  {
-   std::string keyName = event.GetKeyName();
+   const std::string& keyName = event.GetKeyName();
+   const std::string& deviceName = event.GetDeviceName();
  
    if(mIsFocusIndicatorShown == UNKNOWN)
    {
        else
        {
          // Move the focus towards left
-         MoveFocus(Toolkit::Control::KeyboardFocus::LEFT);
+         MoveFocus(Toolkit::Control::KeyboardFocus::LEFT, deviceName);
        }
  
        isFocusStartableKey = true;
        else
        {
          // Move the focus towards right
-         MoveFocus(Toolkit::Control::KeyboardFocus::RIGHT);
+         MoveFocus(Toolkit::Control::KeyboardFocus::RIGHT, deviceName);
        }
  
        isFocusStartableKey = true;
        else
        {
          // Move the focus towards up
-         MoveFocus(Toolkit::Control::KeyboardFocus::UP);
+         MoveFocus(Toolkit::Control::KeyboardFocus::UP, deviceName);
        }
  
        isFocusStartableKey = true;
        else
        {
          // Move the focus towards down
-         MoveFocus(Toolkit::Control::KeyboardFocus::DOWN);
+         MoveFocus(Toolkit::Control::KeyboardFocus::DOWN, deviceName);
        }
  
        isFocusStartableKey = true;
        else
        {
          // Move the focus towards the previous page
-         MoveFocus(Toolkit::Control::KeyboardFocus::PAGE_UP);
+         MoveFocus(Toolkit::Control::KeyboardFocus::PAGE_UP, deviceName);
        }
  
        isFocusStartableKey = true;
        else
        {
          // Move the focus towards the next page
-         MoveFocus(Toolkit::Control::KeyboardFocus::PAGE_DOWN);
+         MoveFocus(Toolkit::Control::KeyboardFocus::PAGE_DOWN, deviceName);
        }
  
        isFocusStartableKey = true;
          if(!DoMoveFocusToNextFocusGroup(!event.IsShiftModifier()))
          {
            // If the focus group is not changed, Move the focus towards forward, "Shift-Tap" key moves the focus towards backward.
-           MoveFocus(event.IsShiftModifier() ? Toolkit::Control::KeyboardFocus::BACKWARD : Toolkit::Control::KeyboardFocus::FORWARD);
+           MoveFocus(event.IsShiftModifier() ? Toolkit::Control::KeyboardFocus::BACKWARD : Toolkit::Control::KeyboardFocus::FORWARD, deviceName);
          }
        }
  
      {
        // No actor is focused but keyboard focus is activated by the key press
        // Let's try to move the initial focus
-       MoveFocus(Toolkit::Control::KeyboardFocus::RIGHT);
+       MoveFocus(Toolkit::Control::KeyboardFocus::RIGHT, deviceName);
      }
    }
  }