From 1e840d216229bdb863ccf3a7de018e23a6fb8351 Mon Sep 17 00:00:00 2001 From: qianyong325 Date: Thu, 24 Apr 2025 16:47:44 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F=E5=86=99=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: qianyong325 --- common/src/itypes_util.cpp | 7 +++-- .../js_input_method_engine_setting.cpp | 14 +++++++++ .../js_input_method_engine_setting.h | 1 + .../js_text_input_client_engine.cpp | 7 +++++ .../js_get_input_method_controller.cpp | 29 +++++++++++++++++- .../js_get_input_method_controller.h | 1 + .../include/input_attribute.h | 30 ++++++++++++++++--- .../cpp_test/src/input_method_attach_test.cpp | 23 ++++++++++++++ 8 files changed, 105 insertions(+), 7 deletions(-) diff --git a/common/src/itypes_util.cpp b/common/src/itypes_util.cpp index 83102c605..a43e2e587 100644 --- a/common/src/itypes_util.cpp +++ b/common/src/itypes_util.cpp @@ -187,7 +187,8 @@ bool ITypesUtil::Unmarshalling(SubProperty &output, MessageParcel &data) bool ITypesUtil::Marshalling(const InputAttribute &input, MessageParcel &data) { if (!Marshal(data, input.inputPattern, input.enterKeyType, input.inputOption, input.isTextPreviewSupported, - input.bundleName, input.immersiveMode, input.windowId, input.callingDisplayId)) { + input.bundleName, input.immersiveMode, input.windowId, input.callingDisplayId, + static_cast(input.capitalizeMode))) { IMSA_HILOGE("write InputAttribute to message parcel failed."); return false; } @@ -196,11 +197,13 @@ bool ITypesUtil::Marshalling(const InputAttribute &input, MessageParcel &data) bool ITypesUtil::Unmarshalling(InputAttribute &output, MessageParcel &data) { + int32_t capitalizeMode = 0; if (!Unmarshal(data, output.inputPattern, output.enterKeyType, output.inputOption, output.isTextPreviewSupported, - output.bundleName, output.immersiveMode, output.windowId, output.callingDisplayId)) { + output.bundleName, output.immersiveMode, output.windowId, output.callingDisplayId, capitalizeMode)) { IMSA_HILOGE("read InputAttribute from message parcel failed."); return false; } + output.capitalizeMode = static_cast(capitalizeMode); return true; } diff --git a/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.cpp b/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.cpp index 369c7d50e..9acb9bda1 100644 --- a/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.cpp +++ b/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.cpp @@ -85,6 +85,7 @@ napi_value JsInputMethodEngineSetting::Init(napi_env env, napi_value exports) DECLARE_NAPI_STATIC_PROPERTY("ExtendAction", GetJsExtendActionProperty(env)), DECLARE_NAPI_STATIC_PROPERTY("SecurityMode", GetJsSecurityModeProperty(env)), DECLARE_NAPI_STATIC_PROPERTY("ImmersiveMode", GetJsImmersiveModeProperty(env)), + DECLARE_NAPI_STATIC_PROPERTY("CapitalizeMode", GetJsCapitalizeModeProperty(env)) }; NAPI_CALL( env, napi_define_properties(env, exports, sizeof(descriptor) / sizeof(napi_property_descriptor), descriptor)); @@ -189,6 +190,19 @@ napi_value JsInputMethodEngineSetting::GetJsExtendActionProperty(napi_env env) return action; } +napi_value JsInputMethodEngineSetting::GetJsCapitalizeModeProperty(napi_env env) +{ + napi_value jsObject = nullptr; + napi_create_object(env, &jsObject); + bool ret = JsUtil::Object::WriteProperty(env, jsObject, "NONE", static_cast(CapitalizeMode::NONE)); + ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "SENTENCES", + static_cast(CapitalizeMode::SENTENCES)); + ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "WORDS", static_cast(CapitalizeMode::WORDS)); + ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "CHARACTERS", + static_cast(CapitalizeMode::CHARACTERS)); + return ret ? jsObject : JsUtil::Const::Null(env); +} + napi_value JsInputMethodEngineSetting::GetJsSecurityModeProperty(napi_env env) { napi_value securityMode = nullptr; diff --git a/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.h b/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.h index ee2efb61a..a863cf984 100644 --- a/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.h +++ b/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.h @@ -91,6 +91,7 @@ private: static napi_value GetJsExtendActionProperty(napi_env env); static napi_value GetJsSecurityModeProperty(napi_env env); static napi_value GetIntJsConstProperty(napi_env env, int32_t num); + static napi_value GetJsCapitalizeModeProperty(napi_env env); static napi_value GetIMEInstance(napi_env env, napi_callback_info info); static napi_status GetContext(napi_env env, napi_value in, std::shared_ptr &context); void RegisterListener(napi_value callback, std::string type, std::shared_ptr callbackObj); diff --git a/frameworks/js/napi/inputmethodability/js_text_input_client_engine.cpp b/frameworks/js/napi/inputmethodability/js_text_input_client_engine.cpp index b7fcec913..f25285b81 100644 --- a/frameworks/js/napi/inputmethodability/js_text_input_client_engine.cpp +++ b/frameworks/js/napi/inputmethodability/js_text_input_client_engine.cpp @@ -1089,6 +1089,8 @@ napi_value JsInputAttribute::Write(napi_env env, const InputAttribute &nativeObj ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "windowId", nativeObject.windowId); ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "displayId", static_cast(nativeObject.callingDisplayId)); + int32_t capitalizeMode = static_cast(nativeObject.capitalizeMode); + ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "capitalizeMode", capitalizeMode); return ret ? jsObject : JsUtil::Const::Null(env); } @@ -1100,6 +1102,11 @@ bool JsInputAttribute::Read(napi_env env, napi_value jsObject, InputAttribute &n JsUtil::Object::ReadProperty(env, jsObject, "isTextPreviewSupported", nativeObject.isTextPreviewSupported); // not care read bundleName fail JsUtil::Object::ReadProperty(env, jsObject, "bundleName", nativeObject.bundleName); + int32_t capitalizeMode; + if (!JsUtil::Object::ReadProperty(env, jsObject, "capitalizeMode", capitalizeMode)) { + nativeObject.capitalizeMode = CapitalizeMode::NONE; + } + nativeObject.capitalizeMode = static_cast(capitalizeMode); ret = ret && JsUtil::Object::ReadProperty(env, jsObject, "immersiveMode", nativeObject.immersiveMode); return ret; } diff --git a/frameworks/js/napi/inputmethodclient/js_get_input_method_controller.cpp b/frameworks/js/napi/inputmethodclient/js_get_input_method_controller.cpp index b08b9be8e..a70c8c033 100644 --- a/frameworks/js/napi/inputmethodclient/js_get_input_method_controller.cpp +++ b/frameworks/js/napi/inputmethodclient/js_get_input_method_controller.cpp @@ -67,7 +67,8 @@ napi_value JsGetInputMethodController::Init(napi_env env, napi_value info) DECLARE_NAPI_STATIC_PROPERTY("Direction", GetJsDirectionProperty(env)), DECLARE_NAPI_STATIC_PROPERTY("ExtendAction", GetJsExtendActionProperty(env)), DECLARE_NAPI_STATIC_PROPERTY("EnabledState", GetJsEnabledStateProperty(env)), - DECLARE_NAPI_STATIC_PROPERTY("RequestKeyboardReason", GetJsRequestKeyboardReasonProperty(env)) + DECLARE_NAPI_STATIC_PROPERTY("RequestKeyboardReason", GetJsRequestKeyboardReasonProperty(env)), + DECLARE_NAPI_STATIC_PROPERTY("CapitalizeMode", GetJsCapitalizeModeProperty(env)) }; NAPI_CALL(env, napi_define_properties(env, info, sizeof(descriptor) / sizeof(napi_property_descriptor), descriptor)); @@ -224,6 +225,19 @@ napi_value JsGetInputMethodController::GetJsExtendActionProperty(napi_env env) return action; } +napi_value JsGetInputMethodController::GetJsCapitalizeModeProperty(napi_env env) +{ + napi_value jsObject = nullptr; + napi_create_object(env, &jsObject); + bool ret = JsUtil::Object::WriteProperty(env, jsObject, "NONE", static_cast(CapitalizeMode::NONE)); + ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "SENTENCES", + static_cast(CapitalizeMode::SENTENCES)); + ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "WORDS", static_cast(CapitalizeMode::WORDS)); + ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "CHARACTERS", + static_cast(CapitalizeMode::CHARACTERS)); + return ret ? jsObject : JsUtil::Const::Null(env); +} + napi_value JsGetInputMethodController::GetJsEnabledStateProperty(napi_env env) { napi_value status = nullptr; @@ -571,6 +585,19 @@ bool JsGetInputMethodController::GetValue(napi_env env, napi_value in, TextConfi if (!result) { IMSA_HILOGE("get windowId failed."); } + int32_t capitalizeMode = 0; + CapitalizeMode tempCapitalizeMode = CapitalizeMode::NONE; + result = JsUtil::Object::ReadProperty(env, in, "capitalizeMode", capitalizeMode); + if (!result) { + IMSA_HILOGE("not found capitalizeMode."); + } + if (capitalizeMode < static_cast(CapitalizeMode::NONE) || + capitalizeMode > static_cast(CapitalizeMode::CHARACTERS)) { + capitalizeMode = 0; // 0 Default value + IMSA_HILOGE("capitalizeMode value invalid."); + } + tempCapitalizeMode = static_cast(capitalizeMode); + out.inputAttribute.capitalizeMode = tempCapitalizeMode; return ret; } diff --git a/frameworks/js/napi/inputmethodclient/js_get_input_method_controller.h b/frameworks/js/napi/inputmethodclient/js_get_input_method_controller.h index 4b8a383a0..06d2ca28d 100644 --- a/frameworks/js/napi/inputmethodclient/js_get_input_method_controller.h +++ b/frameworks/js/napi/inputmethodclient/js_get_input_method_controller.h @@ -226,6 +226,7 @@ private: static napi_value GetJsDirectionProperty(napi_env env); static napi_value GetJsExtendActionProperty(napi_env env); static napi_value GetJsEnabledStateProperty(napi_env env); + static napi_value GetJsCapitalizeModeProperty(napi_env env); static napi_value GetJsRequestKeyboardReasonProperty(napi_env env); static std::shared_ptr GetEventHandler(); static bool IsTextPreviewSupported(); diff --git a/frameworks/native/inputmethod_controller/include/input_attribute.h b/frameworks/native/inputmethod_controller/include/input_attribute.h index 6d0242dcd..b9b64753c 100644 --- a/frameworks/native/inputmethod_controller/include/input_attribute.h +++ b/frameworks/native/inputmethod_controller/include/input_attribute.h @@ -23,6 +23,12 @@ namespace OHOS { namespace MiscServices { +enum class CapitalizeMode: int32_t { + NONE = 0, + SENTENCES, + WORDS, + CHARACTERS +}; struct InputAttribute { static const int32_t PATTERN_TEXT = 0x00000001; @@ -38,17 +44,33 @@ struct InputAttribute { int32_t immersiveMode = 0; uint32_t windowId = 0; // for transfer uint64_t callingDisplayId = 0; + CapitalizeMode capitalizeMode = CapitalizeMode::NONE; bool GetSecurityFlag() const { - return inputPattern == PATTERN_PASSWORD || inputPattern == PATTERN_PASSWORD_SCREEN_LOCK || - PATTERN_PASSWORD_NUMBER == inputPattern || PATTERN_NEWPASSWORD == inputPattern; + return data.WriteInt32(in.inputPattern) && data.WriteInt32(in.enterKeyType) && + data.WriteInt32(in.inputOption) && data.WriteString(in.bundleName) && + data.WriteInt32(in.immersiveMode) && data.WriteUint32(in.windowId) && + data.WriteUint64(in.callingDisplayId) && + data.WriteString16(in.placeholder) && data.WriteString16(in.abilityName) && + data.WriteInt32(static_cast(in.capitalizeMode)); } bool operator==(const InputAttribute &info) const { - return inputPattern == info.inputPattern && enterKeyType == info.enterKeyType && - inputOption == info.inputOption && isTextPreviewSupported == info.isTextPreviewSupported; + bool ret = data.ReadInt32(out.inputPattern) && data.ReadInt32(out.enterKeyType) && + data.ReadInt32(out.inputOption) && data.ReadString(out.bundleName) && + data.ReadInt32(out.immersiveMode) && data.ReadUint32(out.windowId) && + data.ReadUint64(out.callingDisplayId) && + data.ReadString16(out.placeholder) && data.ReadString16(out.abilityName); + int32_t capitalizeMode = 0; + ret = ret && data.ReadInt32(capitalizeMode); + if (capitalizeMode < static_cast(CapitalizeMode::NONE) || + capitalizeMode > static_cast(CapitalizeMode::CHARACTERS)) { + capitalizeMode = 0; + } + out.capitalizeMode = static_cast(capitalizeMode); + return ret; } inline std::string ToString() const diff --git a/test/unittest/cpp_test/src/input_method_attach_test.cpp b/test/unittest/cpp_test/src/input_method_attach_test.cpp index 4efc06384..56210a74e 100644 --- a/test/unittest/cpp_test/src/input_method_attach_test.cpp +++ b/test/unittest/cpp_test/src/input_method_attach_test.cpp @@ -783,5 +783,28 @@ HWTEST_F(InputMethodAttachTest, testAttach007, TestSize.Level0) EXPECT_EQ(ret, ErrorCode::NO_ERROR); EXPECT_EQ(inputPattern, config.inputAttribute.inputPattern); } + +/** + * @tc.name: testSetCapitalizeMode_001 + * @tc.desc: test set capitalizeMode after attach + * @tc.type: FUNC + */ +HWTEST_F(InputMethodAttachTest, testSetCapitalizeMode_001, TestSize.Level0) +{ + IMSA_HILOGI("test testSetCapitalizeMode_001."); + sptr textListener = new TextListener(); + InputAttribute attribute; + attribute.inputPattern = 0; + attribute.enterKeyType = 0; + TextConfig config; + config.inputAttribute = attribute; + config.inputAttribute.capitalizeMode = CapitalizeMode::WORDS; + auto ret = inputMethodController_->Attach(textListener, false, config); + EXPECT_EQ(ret, ErrorCode::NO_ERROR); + TextTotalConfig totalConfig; + ret = inputMethodAbility_->GetTextConfig(totalConfig); + EXPECT_EQ(ret, ErrorCode::NO_ERROR); + EXPECT_EQ(totalConfig.inputAttribute.capitalizeMode, config.inputAttribute.capitalizeMode); +} } // namespace MiscServices } // namespace OHOS -- Gitee From 891a90183e1d122710aa039ac5776e21d7dc8b5c Mon Sep 17 00:00:00 2001 From: qianyong325 Date: Thu, 24 Apr 2025 16:58:15 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F=E5=86=99=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: qianyong325 --- .../include/input_attribute.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/frameworks/native/inputmethod_controller/include/input_attribute.h b/frameworks/native/inputmethod_controller/include/input_attribute.h index b9b64753c..c8c44a0b9 100644 --- a/frameworks/native/inputmethod_controller/include/input_attribute.h +++ b/frameworks/native/inputmethod_controller/include/input_attribute.h @@ -46,18 +46,20 @@ struct InputAttribute { uint64_t callingDisplayId = 0; CapitalizeMode capitalizeMode = CapitalizeMode::NONE; - bool GetSecurityFlag() const + static bool Marshalling(const InputAttribute &in, MessageParcel &data) { return data.WriteInt32(in.inputPattern) && data.WriteInt32(in.enterKeyType) && data.WriteInt32(in.inputOption) && data.WriteString(in.bundleName) && data.WriteInt32(in.immersiveMode) && data.WriteUint32(in.windowId) && data.WriteUint64(in.callingDisplayId) && + data.WriteString16(in.placeholder) && data.WriteString16(in.abilityName); data.WriteString16(in.placeholder) && data.WriteString16(in.abilityName) && data.WriteInt32(static_cast(in.capitalizeMode)); } - bool operator==(const InputAttribute &info) const + static bool Unmarshalling(InputAttribute &out, MessageParcel &data) { + return data.ReadInt32(out.inputPattern) && data.ReadInt32(out.enterKeyType) && bool ret = data.ReadInt32(out.inputPattern) && data.ReadInt32(out.enterKeyType) && data.ReadInt32(out.inputOption) && data.ReadString(out.bundleName) && data.ReadInt32(out.immersiveMode) && data.ReadUint32(out.windowId) && @@ -73,6 +75,18 @@ struct InputAttribute { return ret; } + bool GetSecurityFlag() const + { + return inputPattern == PATTERN_PASSWORD || inputPattern == PATTERN_PASSWORD_SCREEN_LOCK || + PATTERN_PASSWORD_NUMBER == inputPattern || PATTERN_NEWPASSWORD == inputPattern; + } + + bool operator==(const InputAttribute &info) const + { + return inputPattern == info.inputPattern && enterKeyType == info.enterKeyType && + inputOption == info.inputOption && isTextPreviewSupported == info.isTextPreviewSupported; + } + inline std::string ToString() const { std::stringstream ss; -- Gitee From f02880ce44edfe4edfce803e756088f35ee79945 Mon Sep 17 00:00:00 2001 From: qianyong325 Date: Thu, 24 Apr 2025 18:47:28 +0800 Subject: [PATCH 3/3] code fix Signed-off-by: qianyong325 --- .../include/input_attribute.h | 42 ++++++------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/frameworks/native/inputmethod_controller/include/input_attribute.h b/frameworks/native/inputmethod_controller/include/input_attribute.h index c8c44a0b9..c204fc8c0 100644 --- a/frameworks/native/inputmethod_controller/include/input_attribute.h +++ b/frameworks/native/inputmethod_controller/include/input_attribute.h @@ -46,35 +46,6 @@ struct InputAttribute { uint64_t callingDisplayId = 0; CapitalizeMode capitalizeMode = CapitalizeMode::NONE; - static bool Marshalling(const InputAttribute &in, MessageParcel &data) - { - return data.WriteInt32(in.inputPattern) && data.WriteInt32(in.enterKeyType) && - data.WriteInt32(in.inputOption) && data.WriteString(in.bundleName) && - data.WriteInt32(in.immersiveMode) && data.WriteUint32(in.windowId) && - data.WriteUint64(in.callingDisplayId) && - data.WriteString16(in.placeholder) && data.WriteString16(in.abilityName); - data.WriteString16(in.placeholder) && data.WriteString16(in.abilityName) && - data.WriteInt32(static_cast(in.capitalizeMode)); - } - - static bool Unmarshalling(InputAttribute &out, MessageParcel &data) - { - return data.ReadInt32(out.inputPattern) && data.ReadInt32(out.enterKeyType) && - bool ret = data.ReadInt32(out.inputPattern) && data.ReadInt32(out.enterKeyType) && - data.ReadInt32(out.inputOption) && data.ReadString(out.bundleName) && - data.ReadInt32(out.immersiveMode) && data.ReadUint32(out.windowId) && - data.ReadUint64(out.callingDisplayId) && - data.ReadString16(out.placeholder) && data.ReadString16(out.abilityName); - int32_t capitalizeMode = 0; - ret = ret && data.ReadInt32(capitalizeMode); - if (capitalizeMode < static_cast(CapitalizeMode::NONE) || - capitalizeMode > static_cast(CapitalizeMode::CHARACTERS)) { - capitalizeMode = 0; - } - out.capitalizeMode = static_cast(capitalizeMode); - return ret; - } - bool GetSecurityFlag() const { return inputPattern == PATTERN_PASSWORD || inputPattern == PATTERN_PASSWORD_SCREEN_LOCK || @@ -113,9 +84,11 @@ struct InputAttributeInner : public Parcelable { int32_t immersiveMode = 0; uint32_t windowId = 0; // for transfer uint64_t callingDisplayId = 0; + CapitalizeMode capitalizeMode = CapitalizeMode::NONE; bool ReadFromParcel(Parcel &in) { + int32_t capitalizeModeTemp = 0; inputPattern = in.ReadInt32(); enterKeyType = in.ReadInt32(); inputOption = in.ReadInt32(); @@ -124,7 +97,13 @@ struct InputAttributeInner : public Parcelable { immersiveMode = in.ReadInt32(); windowId = in.ReadUint32(); callingDisplayId = in.ReadUint64(); - return true; + auto ret = in.ReadInt32(capitalizeModeTemp); + if (capitalizeModeTemp < static_cast(CapitalizeMode::NONE) || + capitalizeModeTemp > static_cast(CapitalizeMode::CHARACTERS)) { + capitalizeModeTemp = 0; + } + capitalizeMode = static_cast(capitalizeModeTemp); + return ret; } bool Marshalling(Parcel &out) const @@ -153,6 +132,9 @@ struct InputAttributeInner : public Parcelable { if (!out.WriteUint64(callingDisplayId)) { return false; } + if (!out.WriteInt32(static_cast(capitalizeMode))) { + return false; + } return true; } -- Gitee