From: Bowon Ryu Date: Mon, 26 Aug 2024 04:48:30 +0000 (+0900) Subject: [Tizen] Fix text cursor visibility issue X-Git-Tag: accepted/tizen/7.0/unified/20240903.174535~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0931e18fdb4aade858e6a4efdefbeb41b72f9786;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git [Tizen] Fix text cursor visibility issue Ensured that the cursor remains active even when the keyboard is invisible but the control still has focus. Change-Id: Ie4a57646f866eecc7c0082615155dd6cc0ad889c Signed-off-by: Bowon Ryu --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp index fac21a0dc5..60ca44d9f5 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp @@ -1459,6 +1459,53 @@ int utcDaliTextEditorTextChangedWithInputMethodContext(void) END_TEST; } +int utcDaliTextEditorFocusWithInputMethodContext(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextEditorFocusWithInputMethodContext"); + TextEditor editor = TextEditor::New(); + DALI_TEST_CHECK(editor); + + application.GetScene().Add(editor); + editor.SetProperty(DevelTextEditor::Property::ENABLE_EDITING, true); + application.SendNotification(); + application.Render(); + + // get InputMethodContext + InputMethodContext inputMethodContext = DevelTextEditor::GetInputMethodContext(editor); + DALI_TEST_CHECK(inputMethodContext); + + // connect StatusChangedSignal + editor.SetKeyInputFocus(); + + // keyboard shown + inputMethodContext.StatusChangedSignal().Emit(true); + application.SendNotification(); + application.Render(); + + // keyboard hidden + inputMethodContext.StatusChangedSignal().Emit(false); + application.SendNotification(); + application.Render(); + + // set focus and keyboard shown + editor.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true); + KeyboardFocusManager::Get().SetCurrentFocusActor(editor); + + inputMethodContext.StatusChangedSignal().Emit(true); + application.SendNotification(); + application.Render(); + + // keyboard hidden, focus should remain + inputMethodContext.StatusChangedSignal().Emit(false); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(editor, KeyboardFocusManager::Get().GetCurrentFocusActor(), TEST_LOCATION); + + END_TEST; +} + int utcDaliTextEditorInputStyleChanged01(void) { // The text-editor emits signals when the input style changes. These changes of style are diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index 2f97873031..f033a33fc6 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp @@ -1839,6 +1839,53 @@ int utcDaliTextFieldInputFilterWithInputMethodContext(void) END_TEST; } +int utcDaliTextFieldFocusWithInputMethodContext(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldFocusWithInputMethodContext"); + TextField field = TextField::New(); + DALI_TEST_CHECK(field); + + application.GetScene().Add(field); + field.SetProperty(DevelTextField::Property::ENABLE_EDITING, true); + application.SendNotification(); + application.Render(); + + // get InputMethodContext + InputMethodContext inputMethodContext = DevelTextField::GetInputMethodContext(field); + DALI_TEST_CHECK(inputMethodContext); + + // connect StatusChangedSignal + field.SetKeyInputFocus(); + + // keyboard shown + inputMethodContext.StatusChangedSignal().Emit(true); + application.SendNotification(); + application.Render(); + + // keyboard hidden + inputMethodContext.StatusChangedSignal().Emit(false); + application.SendNotification(); + application.Render(); + + // set focus and keyboard shown + field.SetProperty(Actor::Property::KEYBOARD_FOCUSABLE, true); + KeyboardFocusManager::Get().SetCurrentFocusActor(field); + + inputMethodContext.StatusChangedSignal().Emit(true); + application.SendNotification(); + application.Render(); + + // keyboard hidden, focus should remain + inputMethodContext.StatusChangedSignal().Emit(false); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(field, KeyboardFocusManager::Get().GetCurrentFocusActor(), TEST_LOCATION); + + END_TEST; +} + // Negative test for the textChanged signal. int utcDaliTextFieldTextChangedN(void) { diff --git a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp index dba3f82020..b856c0ff6b 100644 --- a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp @@ -1283,10 +1283,21 @@ void TextEditor::KeyboardStatusChanged(bool keyboardShown) { DALI_LOG_INFO(gTextEditorLogFilter, Debug::Verbose, "TextEditor::KeyboardStatusChanged %p keyboardShown %d\n", mController.Get(), keyboardShown); + bool isFocused = false; + + Dali::Toolkit::KeyboardFocusManager keyboardFocusManager = Dali::Toolkit::KeyboardFocusManager::Get(); + if(keyboardFocusManager) + { + isFocused = keyboardFocusManager.GetCurrentFocusActor() == Self(); + } + // Just hide the grab handle when keyboard is hidden. if(!keyboardShown) { - mController->KeyboardFocusLostEvent(); + if(!isFocused) + { + mController->KeyboardFocusLostEvent(); + } } else { diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index 11547072cd..2d7fb5a3df 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -1142,10 +1142,21 @@ void TextField::KeyboardStatusChanged(bool keyboardShown) { DALI_LOG_INFO(gTextFieldLogFilter, Debug::Verbose, "TextField::KeyboardStatusChanged %p keyboardShown %d\n", mController.Get(), keyboardShown); + bool isFocused = false; + + Dali::Toolkit::KeyboardFocusManager keyboardFocusManager = Dali::Toolkit::KeyboardFocusManager::Get(); + if(keyboardFocusManager) + { + isFocused = keyboardFocusManager.GetCurrentFocusActor() == Self(); + } + // Just hide the grab handle when keyboard is hidden. if(!keyboardShown) { - mController->KeyboardFocusLostEvent(); + if(!isFocused) + { + mController->KeyboardFocusLostEvent(); + } } else {