diff --git a/common/src/itypes_util.cpp b/common/src/itypes_util.cpp index 83102c605a147d0d6597c2f094e5c6c24c2a3498..a43e2e58765c61b262ac01aec4ef24b9441f7948 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 369c7d50ee0fe9fb96e8011474782dc2bf7e0952..9acb9bda163e90e4bd3c3057d66ff20007fc8b4a 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 ee2efb61aeccaeeed8c7f9d01e140cd5156d96cf..a863cf984f1fbcc4599ef4a9831108343996a86a 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 b7fcec913b184adce344c877d1f1ab315c3b912e..f25285b819fdf38f1cc9dcff922a8f8f0252495f 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 b08b9be8efa1500e0afcd43dc74f6eb5c56a30e8..a70c8c033180a3b0131992a8c7f96fc6f5a024e9 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 4b8a383a0bae7e773a224b0001d03031b73b72b4..06d2ca28de74d22d37869af481771c6cb4b4dbde 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 6d0242dcd6c372155df6c55d49fd345d5879bb4f..c204fc8c07a6429112194156848099f49f9dbf29 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,6 +44,7 @@ struct InputAttribute { int32_t immersiveMode = 0; uint32_t windowId = 0; // for transfer uint64_t callingDisplayId = 0; + CapitalizeMode capitalizeMode = CapitalizeMode::NONE; bool GetSecurityFlag() const { @@ -77,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(); @@ -88,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 @@ -117,6 +132,9 @@ struct InputAttributeInner : public Parcelable { if (!out.WriteUint64(callingDisplayId)) { return false; } + if (!out.WriteInt32(static_cast(capitalizeMode))) { + return false; + } return true; } 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 4efc06384c5da426d03df09bc1219365b6c5f7ec..56210a74e64a7535b04e58ff9a1140fe687d8951 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