diff --git a/common/src/itypes_util.cpp b/common/src/itypes_util.cpp index 6df768c01bdfc6b77a1c26d52fa501630150de93..480b791f155b33d379e04f106592e6837cf22a17 100644 --- a/common/src/itypes_util.cpp +++ b/common/src/itypes_util.cpp @@ -190,7 +190,7 @@ 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.placeholder, input.abilityName)) { + input.placeholder, input.abilityName, static_cast(input.capitalizeMode))) { IMSA_HILOGE("write InputAttribute to message parcel failed."); return false; } @@ -199,12 +199,14 @@ 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.placeholder, output.abilityName)) { + output.placeholder, output.abilityName, 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 71bce3a3a32e5bd566f8a6d2541c5d1e77bd5369..9c10248d0712c912b44f644df4776c8be039b982 100644 --- a/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.cpp +++ b/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.cpp @@ -93,6 +93,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)); @@ -197,6 +198,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 7b73cf7ff86518d8fd09945677ef4889aa66d406..fc6d2c3dc6a603052fbf21e6c51f997cb26734cf 100644 --- a/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.h +++ b/frameworks/js/napi/inputmethodability/js_input_method_engine_setting.h @@ -93,6 +93,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 51aa8806d783060566ce10012451afdd5a394077..cdc1f24888e832de305f15fe32982a080d184fcc 100644 --- a/frameworks/js/napi/inputmethodability/js_text_input_client_engine.cpp +++ b/frameworks/js/napi/inputmethodability/js_text_input_client_engine.cpp @@ -977,6 +977,8 @@ napi_value JsInputAttribute::Write(napi_env env, const InputAttribute &nativeObj static_cast(nativeObject.callingDisplayId)); ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "placeholder", Str16ToStr8(nativeObject.placeholder)); ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "abilityName", Str16ToStr8(nativeObject.abilityName)); + int32_t capitalizeMode = static_cast(nativeObject.capitalizeMode); + ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "capitalizeMode", capitalizeMode); return ret ? jsObject : JsUtil::Const::Null(env); } @@ -990,6 +992,12 @@ bool JsInputAttribute::Read(napi_env env, napi_value jsObject, InputAttribute &n JsUtil::Object::ReadProperty(env, jsObject, "bundleName", nativeObject.bundleName); JsUtil::Object::ReadProperty(env, jsObject, "placeholder", nativeObject.placeholder); JsUtil::Object::ReadProperty(env, jsObject, "abilityName", nativeObject.abilityName); + int32_t capitalizeMode; + if (!JsUtil::Object::ReadProperty(env, jsObject, "capitalizeMode", capitalizeMode)) { + nativeObject.capitalizeMode = CapitalizeMode::NONE; + } else { + 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 80ec6b2f4edca26ef921b1181694b7765909777d..e66cecfa6b16f673659f99d34695a6fef36c1e22 100644 --- a/frameworks/js/napi/inputmethodclient/js_get_input_method_controller.cpp +++ b/frameworks/js/napi/inputmethodclient/js_get_input_method_controller.cpp @@ -69,7 +69,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)); @@ -243,6 +244,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; @@ -594,6 +608,19 @@ bool JsGetInputMethodController::GetValue(napi_env env, napi_value in, TextConfi if (!result) { IMSA_HILOGE("get newEditBox 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 2964e1fefd90827a465cdbe6d72079d6ec9fedc1..da9589ba8ffa2d9cfb2d62308c5fedd121c608f8 100644 --- a/frameworks/js/napi/inputmethodclient/js_get_input_method_controller.h +++ b/frameworks/js/napi/inputmethodclient/js_get_input_method_controller.h @@ -237,6 +237,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 91dbf35acf3bf1ee37edf2628207cb2098db3012..e7508fadc85b47806237c6f679e4e9d64b9cac9f 100644 --- a/frameworks/native/inputmethod_controller/include/input_attribute.h +++ b/frameworks/native/inputmethod_controller/include/input_attribute.h @@ -24,6 +24,13 @@ namespace OHOS { namespace MiscServices { +enum class CapitalizeMode: int32_t { + NONE = 0, + SENTENCES, + WORDS, + CHARACTERS +}; + struct InputAttribute { static const int32_t PATTERN_TEXT = 0x00000001; static const int32_t PATTERN_PASSWORD = 0x00000007; @@ -41,6 +48,7 @@ struct InputAttribute { uint64_t callingDisplayId = 0; std::u16string placeholder { u"" }; std::u16string abilityName { u"" }; + CapitalizeMode capitalizeMode = CapitalizeMode::NONE; static bool Marshalling(const InputAttribute &in, MessageParcel &data) { @@ -48,16 +56,25 @@ struct InputAttribute { 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 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 7bfc660d0628a435605a605da710f1b8a14b650c..0d1373deeac31cba80c911bc503c765c394742f9 100644 --- a/test/unittest/cpp_test/src/input_method_attach_test.cpp +++ b/test/unittest/cpp_test/src/input_method_attach_test.cpp @@ -778,5 +778,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