Merge branch 'master' of gitee.com:openharmony/inputmethod_imf into master

Signed-off-by: Hollokin <taoyuxin2@huawei.com>
This commit is contained in:
Hollokin 2022-11-25 13:58:46 +00:00 committed by Gitee
commit 32b68375a5
112 changed files with 2968 additions and 842 deletions

View File

@ -20,9 +20,9 @@ licensefile:
tasklist(only for batch mode): tasklist(only for batch mode):
1. task: Define oat check thread, each task will start a new thread. 1. task: Define oat check thread, each task will start a new thread.
2. task name: Only an name, no practical effect. 2. task name: Only a name, no practical effect.
3. task policy: Default policy for projects under this task, this field is required and the specified policy must defined in policylist. 3. task policy: Default policy for projects under this task, this field is required and the specified policy must be defined in policylist.
4. task filter: Default filefilter for projects under this task, this field is required and the specified filefilter must defined in filefilterlist. 4. task filter: Default filefilter for projects under this task, this field is required and the specified filefilter must be defined in filefilterlist.
5. task project: Projects to be checked, the path field define the source root dir of the project. 5. task project: Projects to be checked, the path field define the source root dir of the project.
@ -39,7 +39,7 @@ policyList:
"filename" is used to check whether the specified file exists in the specified path(support projectroot in default OAT.xml), supported file names: LICENSE, README, README.OpenSource "filename" is used to check whether the specified file exists in the specified path(support projectroot in default OAT.xml), supported file names: LICENSE, README, README.OpenSource
4. policyitem name: This field is used for define the license, copyright, "*" means match all, the "!" prefix means could not match this value. For example, "!GPL" means can not use GPL license. 4. policyitem name: This field is used for define the license, copyright, "*" means match all, the "!" prefix means could not match this value. For example, "!GPL" means can not use GPL license.
5. policyitem path: This field is used for define the source file scope to apply this policyitem, the "!" prefix means exclude the files. For example, "!.*/lib/.*" means files in lib dir will be exclude while process this policyitem. 5. policyitem path: This field is used for define the source file scope to apply this policyitem, the "!" prefix means exclude the files. For example, "!.*/lib/.*" means files in lib dir will be excluded while process this policyitem.
6. policyitem rule and group: These two fields are used together to merge policy results. "may" policyitems in the same group means any one in this group passed, the result will be passed. 6. policyitem rule and group: These two fields are used together to merge policy results. "may" policyitems in the same group means any one in this group passed, the result will be passed.
7. policyitem filefilter: Used to bind filefilter which define filter rules. 7. policyitem filefilter: Used to bind filefilter which define filter rules.
8. filefilter: Filter rules, the type filename is used to filter file name, the type filepath is used to filter file path. 8. filefilter: Filter rules, the type filename is used to filter file name, the type filepath is used to filter file path.

View File

@ -583,7 +583,7 @@ keyboardDelegate.off('textChange', (text) => {
</tr> </tr>
<tr id="row204321219393"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1893413268144"><a name="p1893413268144"></a><a name="p1893413268144"></a>hideKeyboard(): Promise&lt;void&gt;;</p> <tr id="row204321219393"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1893413268144"><a name="p1893413268144"></a><a name="p1893413268144"></a>hideKeyboard(): Promise&lt;void&gt;;</p>
</td> </td>
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p18761104812149"><a name="p18761104812149"></a><a name="p18761104812149"></a>隐藏输入法使用peomise形式返回结果。参数个数为0否则抛出异常。</p> <td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p18761104812149"><a name="p18761104812149"></a><a name="p18761104812149"></a>隐藏输入法使用promise形式返回结果。参数个数为0否则抛出异常。</p>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -84,9 +84,7 @@
} }
], ],
"test": [ "test": [
"//base/inputmethod/imf/unitest:InputMethodControllerTest", "//base/inputmethod/imf/unitest:unittest",
"//base/inputmethod/imf/unitest:InputMethodAbilityTest",
"//base/inputmethod/imf/unitest:InputMethodServiceTest",
"//base/inputmethod/imf/test/fuzztest:fuzztest", "//base/inputmethod/imf/test/fuzztest:fuzztest",
"//base/inputmethod/imf/test/unitest/src:unittest" "//base/inputmethod/imf/test/unitest/src:unittest"
] ]

View File

@ -4,6 +4,7 @@
"path" : ["/system/bin/sa_main", "/system/profile/inputmethod_service.xml"], "path" : ["/system/bin/sa_main", "/system/profile/inputmethod_service.xml"],
"uid" : "inputmethod", "uid" : "inputmethod",
"gid" : ["inputmethod", "shell"], "gid" : ["inputmethod", "shell"],
"permission" : ["ohos.permission.INPUT_MONITORING"],
"caps" : [], "caps" : [],
"secon" : "u:r:inputmethod_service:s0" "secon" : "u:r:inputmethod_service:s0"
} }

View File

@ -25,9 +25,10 @@ namespace OHOS {
static bool SetDefaultIme(int32_t userId, const std::string &imeName); static bool SetDefaultIme(int32_t userId, const std::string &imeName);
static std::string GetDefaultIme(int32_t userId); static std::string GetDefaultIme(int32_t userId);
static constexpr const char *DEFAULT_PACKAGE_NAME = "com.example.kikakeyboard";
static constexpr const char *DEFAULT_ABILITY_NAME = "ServiceExtAbility";
private: private:
static const char *DEFAULT_IME_KEY; static const char *DEFAULT_IME_KEY;
static const char *DEFAULT_IME_NAME;
static constexpr int CONFIG_LEN = 128; static constexpr int CONFIG_LEN = 128;
static const int32_t main_userId = 100; static const int32_t main_userId = 100;
}; };

View File

@ -19,7 +19,6 @@
namespace OHOS { namespace OHOS {
namespace MiscServices { namespace MiscServices {
const char *ParaHandle::DEFAULT_IME_KEY = "persist.sys.default_ime"; const char *ParaHandle::DEFAULT_IME_KEY = "persist.sys.default_ime";
const char *ParaHandle::DEFAULT_IME_NAME = "com.example.kikakeyboard/ServiceExtAbility";
bool ParaHandle::SetDefaultIme(int32_t userId, const std::string &imeName) bool ParaHandle::SetDefaultIme(int32_t userId, const std::string &imeName)
{ {
if (userId != main_userId) { if (userId != main_userId) {
@ -41,9 +40,9 @@ namespace OHOS {
if (code > 0) { if (code > 0) {
return value; return value;
} }
std::string defaultName = std::string(DEFAULT_PACKAGE_NAME) + "/" + std::string(DEFAULT_ABILITY_NAME);
SetDefaultIme(userId, DEFAULT_IME_NAME); SetDefaultIme(userId, defaultName);
return DEFAULT_IME_NAME; return defaultName;
} }
} // namespace MiscServices } // namespace MiscServices
} // namespace OHOS } // namespace OHOS

View File

@ -43,7 +43,6 @@ public:
InputMethodAbility(); InputMethodAbility();
~InputMethodAbility(); ~InputMethodAbility();
static sptr<InputMethodAbility> GetInstance(); static sptr<InputMethodAbility> GetInstance();
sptr<IInputMethodCore> OnConnect();
int32_t InsertText(const std::string text); int32_t InsertText(const std::string text);
void setImeListener(std::shared_ptr<InputMethodEngineListener> imeListener); void setImeListener(std::shared_ptr<InputMethodEngineListener> imeListener);
void setKdListener(std::shared_ptr<KeyboardListener> kdListener); void setKdListener(std::shared_ptr<KeyboardListener> kdListener);
@ -65,7 +64,7 @@ private:
MessageHandler *msgHandler; MessageHandler *msgHandler;
bool mSupportPhysicalKbd = false; bool mSupportPhysicalKbd = false;
InputAttribute editorAttribute; InputAttribute editorAttribute;
int32_t displyId = 0; int32_t displayId = 0;
sptr<IRemoteObject> startInputToken; sptr<IRemoteObject> startInputToken;
InputChannel *writeInputChannel; InputChannel *writeInputChannel;
bool stop_; bool stop_;
@ -99,6 +98,7 @@ private:
void Initialize(); void Initialize();
void WorkThread(); void WorkThread();
void QuitWorkThread();
void OnInitialInput(Message *msg); void OnInitialInput(Message *msg);
void OnStartInput(Message *msg); void OnStartInput(Message *msg);
@ -113,7 +113,7 @@ private:
void InitialInputWindow(); void InitialInputWindow();
void ShowInputWindow(bool isShowKeyboard, const SubProperty &subProperty); void ShowInputWindow(bool isShowKeyboard, const SubProperty &subProperty);
void DissmissInputWindow(); void DismissInputWindow();
void BindServiceAndClient(); void BindServiceAndClient();
}; };

View File

@ -46,12 +46,11 @@ InputMethodAbility::InputMethodAbility() : stop_(false)
InputMethodAbility::~InputMethodAbility() InputMethodAbility::~InputMethodAbility()
{ {
IMSA_HILOGI("InputMethodAbility::~InputMethodAbility"); IMSA_HILOGI("InputMethodAbility::~InputMethodAbility");
instance_ = nullptr; QuitWorkThread();
if (msgHandler) { if (msgHandler) {
delete msgHandler; delete msgHandler;
msgHandler = nullptr; msgHandler = nullptr;
} }
stop_ = true;
} }
sptr<InputMethodAbility> InputMethodAbility::GetInstance() sptr<InputMethodAbility> InputMethodAbility::GetInstance()
@ -196,6 +195,7 @@ void InputMethodAbility::WorkThread()
break; break;
} }
default: { default: {
IMSA_HILOGD("the message is %{public}d.", msg->msgId_);
break; break;
} }
} }
@ -208,7 +208,7 @@ void InputMethodAbility::OnInitialInput(Message *msg)
{ {
IMSA_HILOGI("InputMethodAbility::OnInitialInput"); IMSA_HILOGI("InputMethodAbility::OnInitialInput");
MessageParcel *data = msg->msgContent_; MessageParcel *data = msg->msgContent_;
displyId = data->ReadInt32(); displayId = data->ReadInt32();
sptr<IRemoteObject> channelObject = data->ReadRemoteObject(); sptr<IRemoteObject> channelObject = data->ReadRemoteObject();
if (channelObject == nullptr) { if (channelObject == nullptr) {
IMSA_HILOGI("InputMethodAbility::OnInitialInput channelObject is nullptr"); IMSA_HILOGI("InputMethodAbility::OnInitialInput channelObject is nullptr");
@ -268,7 +268,7 @@ void InputMethodAbility::OnShowKeyboard(Message *msg)
void InputMethodAbility::OnHideKeyboard(Message *msg) void InputMethodAbility::OnHideKeyboard(Message *msg)
{ {
IMSA_HILOGI("InputMethodAbility::OnHideKeyboard"); IMSA_HILOGI("InputMethodAbility::OnHideKeyboard");
DissmissInputWindow(); DismissInputWindow();
} }
void InputMethodAbility::OnStopInput(Message *msg) void InputMethodAbility::OnStopInput(Message *msg)
@ -376,17 +376,17 @@ void InputMethodAbility::ShowInputWindow(bool isShowKeyboard, const SubProperty
channel->SendKeyboardStatus(KEYBOARD_SHOW); channel->SendKeyboardStatus(KEYBOARD_SHOW);
} }
void InputMethodAbility::DissmissInputWindow() void InputMethodAbility::DismissInputWindow()
{ {
IMSA_HILOGI("InputMethodAbility::DissmissInputWindow"); IMSA_HILOGI("InputMethodAbility::DismissInputWindow");
if (!imeListener_) { if (!imeListener_) {
IMSA_HILOGI("InputMethodAbility::DissmissInputWindow imeListener_ is nullptr"); IMSA_HILOGI("InputMethodAbility::DismissInputWindow imeListener_ is nullptr");
return; return;
} }
imeListener_->OnKeyboardStatus(false); imeListener_->OnKeyboardStatus(false);
std::shared_ptr<InputDataChannelProxy> channel = GetInputDataChannel(); std::shared_ptr<InputDataChannelProxy> channel = GetInputDataChannel();
if (channel == nullptr) { if (channel == nullptr) {
IMSA_HILOGI("InputMethodAbility::DissmissInputWindow channel is nullptr"); IMSA_HILOGI("InputMethodAbility::DismissInputWindow channel is nullptr");
return; return;
} }
channel->SendKeyboardStatus(KEYBOARD_HIDE); channel->SendKeyboardStatus(KEYBOARD_HIDE);
@ -518,12 +518,12 @@ void InputMethodAbility::SetInputDataChannel(sptr<IRemoteObject> &object)
{ {
IMSA_HILOGI("run in SetInputDataChannel"); IMSA_HILOGI("run in SetInputDataChannel");
std::lock_guard<std::mutex> lock(dataChannelLock_); std::lock_guard<std::mutex> lock(dataChannelLock_);
std::shared_ptr<InputDataChannelProxy> channalProxy = std::make_shared<InputDataChannelProxy>(object); std::shared_ptr<InputDataChannelProxy> channelProxy = std::make_shared<InputDataChannelProxy>(object);
if (channalProxy == nullptr) { if (channelProxy == nullptr) {
IMSA_HILOGI("InputMethodAbility::SetInputDataChannel inputDataChannel is nullptr"); IMSA_HILOGI("InputMethodAbility::SetInputDataChannel inputDataChannel is nullptr");
return; return;
} }
dataChannel_ = channalProxy; dataChannel_ = channelProxy;
} }
std::shared_ptr<InputDataChannelProxy> InputMethodAbility::GetInputDataChannel() std::shared_ptr<InputDataChannelProxy> InputMethodAbility::GetInputDataChannel()
@ -536,12 +536,12 @@ void InputMethodAbility::SetInputControlChannel(sptr<IRemoteObject> &object)
{ {
IMSA_HILOGI("run in SetInputControlChannel"); IMSA_HILOGI("run in SetInputControlChannel");
std::lock_guard<std::mutex> lock(controlChannelLock_); std::lock_guard<std::mutex> lock(controlChannelLock_);
std::shared_ptr<InputControlChannelProxy> channalProxy = std::make_shared<InputControlChannelProxy>(object); std::shared_ptr<InputControlChannelProxy> channelProxy = std::make_shared<InputControlChannelProxy>(object);
if (channalProxy == nullptr) { if (channelProxy == nullptr) {
IMSA_HILOGI("InputMethodAbility::SetInputControlChannel inputDataChannel is nullptr"); IMSA_HILOGI("InputMethodAbility::SetInputControlChannel inputDataChannel is nullptr");
return; return;
} }
controlChannel_ = channalProxy; controlChannel_ = channelProxy;
} }
std::shared_ptr<InputControlChannelProxy> InputMethodAbility::GetInputControlChannel() std::shared_ptr<InputControlChannelProxy> InputMethodAbility::GetInputControlChannel()
@ -574,5 +574,15 @@ void InputMethodAbility::BindServiceAndClient()
sptr<IInputMethodAgent> inputMethodAgent = sptr(new InputMethodAgentProxy(inputMethodAgentStub)); sptr<IInputMethodAgent> inputMethodAgent = sptr(new InputMethodAgentProxy(inputMethodAgentStub));
mImms->SetCoreAndAgent(stub, inputMethodAgent); mImms->SetCoreAndAgent(stub, inputMethodAgent);
} }
void InputMethodAbility::QuitWorkThread()
{
stop_ = true;
Message *msg = new Message(MessageID::MSG_ID_QUIT_WORKER_THREAD, nullptr);
msgHandler->SendMessage(msg);
if (workThreadHandler.joinable()) {
workThreadHandler.join();
}
}
} // namespace MiscServices } // namespace MiscServices
} // namespace OHOS } // namespace OHOS

View File

@ -34,7 +34,7 @@ InputMethodCoreProxy::~InputMethodCoreProxy() = default;
int32_t InputMethodCoreProxy::initializeInput( int32_t InputMethodCoreProxy::initializeInput(
sptr<IRemoteObject> &startInputToken, int32_t displayId, sptr<IInputControlChannel> &inputControlChannel) sptr<IRemoteObject> &startInputToken, int32_t displayId, sptr<IInputControlChannel> &inputControlChannel)
{ {
IMSA_HILOGI("InputMethodCoreProxy::initializeInput"); IMSA_HILOGD("InputMethodCoreProxy::initializeInput");
auto remote = Remote(); auto remote = Remote();
if (!remote) { if (!remote) {
IMSA_HILOGI("remote is nullptr"); IMSA_HILOGI("remote is nullptr");
@ -75,7 +75,7 @@ int32_t InputMethodCoreProxy::initializeInput(
int32_t InputMethodCoreProxy::InitInputControlChannel(sptr<IInputControlChannel> &inputControlChannel) int32_t InputMethodCoreProxy::InitInputControlChannel(sptr<IInputControlChannel> &inputControlChannel)
{ {
IMSA_HILOGI("InputMethodCoreProxy::InitInputControlChannel"); IMSA_HILOGD("InputMethodCoreProxy::InitInputControlChannel");
auto remote = Remote(); auto remote = Remote();
if (!remote) { if (!remote) {
IMSA_HILOGI("remote is nullptr"); IMSA_HILOGI("remote is nullptr");
@ -105,7 +105,7 @@ int32_t InputMethodCoreProxy::InitInputControlChannel(sptr<IInputControlChannel>
void InputMethodCoreProxy::SetClientState(bool state) void InputMethodCoreProxy::SetClientState(bool state)
{ {
IMSA_HILOGI("InputMethodCoreProxy::SetClientState"); IMSA_HILOGD("InputMethodCoreProxy::SetClientState");
auto remote = Remote(); auto remote = Remote();
if (!remote) { if (!remote) {
IMSA_HILOGI("remote is nullptr"); IMSA_HILOGI("remote is nullptr");
@ -127,7 +127,7 @@ void InputMethodCoreProxy::SetClientState(bool state)
bool InputMethodCoreProxy::startInput( bool InputMethodCoreProxy::startInput(
const sptr<IInputDataChannel> &inputDataChannel, const InputAttribute &editorAttribute, bool supportPhysicalKbd) const sptr<IInputDataChannel> &inputDataChannel, const InputAttribute &editorAttribute, bool supportPhysicalKbd)
{ {
IMSA_HILOGI("InputMethodCoreProxy::startInput"); IMSA_HILOGD("InputMethodCoreProxy::startInput");
auto remote = Remote(); auto remote = Remote();
if (!remote) { if (!remote) {
IMSA_HILOGI("remote is nullptr"); IMSA_HILOGI("remote is nullptr");
@ -159,7 +159,7 @@ bool InputMethodCoreProxy::startInput(
int32_t InputMethodCoreProxy::stopInput() int32_t InputMethodCoreProxy::stopInput()
{ {
IMSA_HILOGI("InputMethodCoreProxy::stopInput"); IMSA_HILOGD("InputMethodCoreProxy::stopInput");
auto remote = Remote(); auto remote = Remote();
if (!remote) { if (!remote) {
IMSA_HILOGI("remote is nullptr"); IMSA_HILOGI("remote is nullptr");
@ -184,7 +184,7 @@ int32_t InputMethodCoreProxy::stopInput()
int32_t InputMethodCoreProxy::showKeyboard( int32_t InputMethodCoreProxy::showKeyboard(
const sptr<IInputDataChannel> &inputDataChannel, bool isShowKeyboard, const SubProperty &subProperty) const sptr<IInputDataChannel> &inputDataChannel, bool isShowKeyboard, const SubProperty &subProperty)
{ {
IMSA_HILOGI("InputMethodCoreProxy::showKeyboard"); IMSA_HILOGD("InputMethodCoreProxy::showKeyboard");
return SendRequest(SHOW_KEYBOARD, [&inputDataChannel, &isShowKeyboard, &subProperty](MessageParcel &data) { return SendRequest(SHOW_KEYBOARD, [&inputDataChannel, &isShowKeyboard, &subProperty](MessageParcel &data) {
return ITypesUtil::Marshal(data, inputDataChannel->AsObject(), isShowKeyboard, subProperty); return ITypesUtil::Marshal(data, inputDataChannel->AsObject(), isShowKeyboard, subProperty);
}); });
@ -192,7 +192,7 @@ int32_t InputMethodCoreProxy::showKeyboard(
void InputMethodCoreProxy::StopInputService(std::string imeId) void InputMethodCoreProxy::StopInputService(std::string imeId)
{ {
IMSA_HILOGI("InputMethodCoreProxy::StopInputService"); IMSA_HILOGD("InputMethodCoreProxy::StopInputService");
auto remote = Remote(); auto remote = Remote();
if (!remote) { if (!remote) {
IMSA_HILOGI("InputMethodCoreProxy::StopInputService remote is nullptr"); IMSA_HILOGI("InputMethodCoreProxy::StopInputService remote is nullptr");
@ -213,7 +213,7 @@ void InputMethodCoreProxy::StopInputService(std::string imeId)
bool InputMethodCoreProxy::hideKeyboard(int32_t flags) bool InputMethodCoreProxy::hideKeyboard(int32_t flags)
{ {
IMSA_HILOGI("InputMethodCoreProxy::hideKeyboard"); IMSA_HILOGD("InputMethodCoreProxy::hideKeyboard");
auto remote = Remote(); auto remote = Remote();
if (!remote) { if (!remote) {
return false; return false;
@ -235,7 +235,7 @@ bool InputMethodCoreProxy::hideKeyboard(int32_t flags)
int32_t InputMethodCoreProxy::setKeyboardType(const KeyboardType &type) int32_t InputMethodCoreProxy::setKeyboardType(const KeyboardType &type)
{ {
IMSA_HILOGI("InputMethodCoreProxy::setKeyboardType"); IMSA_HILOGD("InputMethodCoreProxy::setKeyboardType");
auto remote = Remote(); auto remote = Remote();
if (!remote) { if (!remote) {
IMSA_HILOGI("remote is nullptr"); IMSA_HILOGI("remote is nullptr");
@ -255,7 +255,7 @@ int32_t InputMethodCoreProxy::setKeyboardType(const KeyboardType &type)
int32_t InputMethodCoreProxy::getKeyboardWindowHeight(int32_t &retHeight) int32_t InputMethodCoreProxy::getKeyboardWindowHeight(int32_t &retHeight)
{ {
IMSA_HILOGI("InputMethodCoreProxy::getKeyboardWindowHeight"); IMSA_HILOGD("InputMethodCoreProxy::getKeyboardWindowHeight");
auto remote = Remote(); auto remote = Remote();
if (!remote) { if (!remote) {
IMSA_HILOGI("remote is nullptr"); IMSA_HILOGI("remote is nullptr");
@ -278,13 +278,13 @@ int32_t InputMethodCoreProxy::getKeyboardWindowHeight(int32_t &retHeight)
int32_t InputMethodCoreProxy::SetSubtype(const SubProperty &property) int32_t InputMethodCoreProxy::SetSubtype(const SubProperty &property)
{ {
IMSA_HILOGI("InputMethodCoreProxy::SetSubtype"); IMSA_HILOGD("InputMethodCoreProxy::SetSubtype");
return SendRequest(SET_SUBTYPE, [&property](MessageParcel &data) { return ITypesUtil::Marshal(data, property); }); return SendRequest(SET_SUBTYPE, [&property](MessageParcel &data) { return ITypesUtil::Marshal(data, property); });
} }
int32_t InputMethodCoreProxy::SendRequest(int code, ParcelHandler input, ParcelHandler output) int32_t InputMethodCoreProxy::SendRequest(int code, ParcelHandler input, ParcelHandler output)
{ {
IMSA_HILOGI("InputMethodCoreProxy::%{public}s in", __func__); IMSA_HILOGD("InputMethodCoreProxy::%{public}s in", __func__);
MessageParcel data; MessageParcel data;
MessageParcel reply; MessageParcel reply;
MessageOption option{ MessageOption::TF_SYNC }; MessageOption option{ MessageOption::TF_SYNC };

View File

@ -46,7 +46,7 @@ InputMethodCoreStub::~InputMethodCoreStub()
int32_t InputMethodCoreStub::OnRemoteRequest( int32_t InputMethodCoreStub::OnRemoteRequest(
uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
{ {
IMSA_HILOGI("InputMethodCoreStub::OnRemoteRequest"); IMSA_HILOGD("InputMethodCoreStub::OnRemoteRequest");
auto descriptorToken = data.ReadInterfaceToken(); auto descriptorToken = data.ReadInterfaceToken();
if (descriptorToken != GetDescriptor()) { if (descriptorToken != GetDescriptor()) {
IMSA_HILOGI("InputMethodCoreStub::OnRemoteRequest descriptorToken is invalid"); IMSA_HILOGI("InputMethodCoreStub::OnRemoteRequest descriptorToken is invalid");
@ -146,7 +146,7 @@ int32_t InputMethodCoreStub::OnRemoteRequest(
int32_t InputMethodCoreStub::initializeInput( int32_t InputMethodCoreStub::initializeInput(
sptr<IRemoteObject> &startInputToken, int32_t displayId, sptr<IInputControlChannel> &inputControlChannel) sptr<IRemoteObject> &startInputToken, int32_t displayId, sptr<IInputControlChannel> &inputControlChannel)
{ {
IMSA_HILOGI("InputMethodCoreStub::initializeInput"); IMSA_HILOGD("InputMethodCoreStub::initializeInput");
if (!msgHandler_) { if (!msgHandler_) {
return ErrorCode::ERROR_NULL_POINTER; return ErrorCode::ERROR_NULL_POINTER;
} }
@ -168,7 +168,7 @@ int32_t InputMethodCoreStub::initializeInput(
int32_t InputMethodCoreStub::InitInputControlChannel(sptr<IInputControlChannel> &inputControlChannel) int32_t InputMethodCoreStub::InitInputControlChannel(sptr<IInputControlChannel> &inputControlChannel)
{ {
IMSA_HILOGI("InputMethodCoreStub::initializeInput"); IMSA_HILOGD("InputMethodCoreStub::initializeInput");
if (!msgHandler_) { if (!msgHandler_) {
return ErrorCode::ERROR_NULL_POINTER; return ErrorCode::ERROR_NULL_POINTER;
} }
@ -186,7 +186,7 @@ int32_t InputMethodCoreStub::InitInputControlChannel(sptr<IInputControlChannel>
bool InputMethodCoreStub::startInput( bool InputMethodCoreStub::startInput(
const sptr<IInputDataChannel> &inputDataChannel, const InputAttribute &editorAttribute, bool supportPhysicalKbd) const sptr<IInputDataChannel> &inputDataChannel, const InputAttribute &editorAttribute, bool supportPhysicalKbd)
{ {
IMSA_HILOGI("InputMethodCoreStub::startInput"); IMSA_HILOGD("InputMethodCoreStub::startInput");
if (!msgHandler_) { if (!msgHandler_) {
return ErrorCode::ERROR_NULL_POINTER; return ErrorCode::ERROR_NULL_POINTER;
} }
@ -204,7 +204,7 @@ bool InputMethodCoreStub::startInput(
int32_t InputMethodCoreStub::stopInput() int32_t InputMethodCoreStub::stopInput()
{ {
IMSA_HILOGI("InputMethodCoreStub::stopInput"); IMSA_HILOGD("InputMethodCoreStub::stopInput");
if (!msgHandler_) { if (!msgHandler_) {
return ErrorCode::ERROR_NULL_POINTER; return ErrorCode::ERROR_NULL_POINTER;
} }
@ -216,7 +216,7 @@ int32_t InputMethodCoreStub::stopInput()
void InputMethodCoreStub::SetClientState(bool state) void InputMethodCoreStub::SetClientState(bool state)
{ {
IMSA_HILOGI("InputMethodCoreStub::SetClientState"); IMSA_HILOGD("InputMethodCoreStub::SetClientState");
if (!msgHandler_) { if (!msgHandler_) {
return; return;
} }
@ -229,7 +229,7 @@ void InputMethodCoreStub::SetClientState(bool state)
bool InputMethodCoreStub::hideKeyboard(int32_t flags) bool InputMethodCoreStub::hideKeyboard(int32_t flags)
{ {
IMSA_HILOGI("InputMethodCoreStub::hideKeyboard"); IMSA_HILOGD("InputMethodCoreStub::hideKeyboard");
if (!msgHandler_) { if (!msgHandler_) {
return ErrorCode::ERROR_NULL_POINTER; return ErrorCode::ERROR_NULL_POINTER;
} }
@ -244,7 +244,7 @@ bool InputMethodCoreStub::hideKeyboard(int32_t flags)
int32_t InputMethodCoreStub::setKeyboardType(const KeyboardType &type) int32_t InputMethodCoreStub::setKeyboardType(const KeyboardType &type)
{ {
IMSA_HILOGI("InputMethodCoreStub::setKeyboardType"); IMSA_HILOGD("InputMethodCoreStub::setKeyboardType");
if (!msgHandler_) { if (!msgHandler_) {
return ErrorCode::ERROR_NULL_POINTER; return ErrorCode::ERROR_NULL_POINTER;
} }
@ -258,7 +258,7 @@ int32_t InputMethodCoreStub::setKeyboardType(const KeyboardType &type)
void InputMethodCoreStub::StopInputService(std::string imeId) void InputMethodCoreStub::StopInputService(std::string imeId)
{ {
IMSA_HILOGI("InputMethodCoreStub::StopInputService"); IMSA_HILOGD("InputMethodCoreStub::StopInputService");
if (!msgHandler_) { if (!msgHandler_) {
return; return;
} }
@ -271,7 +271,7 @@ void InputMethodCoreStub::StopInputService(std::string imeId)
int32_t InputMethodCoreStub::getKeyboardWindowHeight(int32_t &retHeight) int32_t InputMethodCoreStub::getKeyboardWindowHeight(int32_t &retHeight)
{ {
IMSA_HILOGI("InputMethodCoreStub::getKeyboardWindowHeight"); IMSA_HILOGD("InputMethodCoreStub::getKeyboardWindowHeight");
if (!msgHandler_) { if (!msgHandler_) {
return ErrorCode::ERROR_NULL_POINTER; return ErrorCode::ERROR_NULL_POINTER;
} }
@ -289,7 +289,7 @@ void InputMethodCoreStub::SetMessageHandler(MessageHandler *msgHandler)
void InputMethodCoreStub::ShowKeyboardOnRemote(MessageParcel &data, MessageParcel &reply) void InputMethodCoreStub::ShowKeyboardOnRemote(MessageParcel &data, MessageParcel &reply)
{ {
IMSA_HILOGI("InputMethodCoreStub::ShowKeyboardOnRemote"); IMSA_HILOGD("InputMethodCoreStub::ShowKeyboardOnRemote");
sptr<IRemoteObject> channel; sptr<IRemoteObject> channel;
bool isShowKeyboard = false; bool isShowKeyboard = false;
SubProperty subProperty; SubProperty subProperty;
@ -303,7 +303,7 @@ void InputMethodCoreStub::ShowKeyboardOnRemote(MessageParcel &data, MessageParce
void InputMethodCoreStub::SetSubtypeOnRemote(MessageParcel &data, MessageParcel &reply) void InputMethodCoreStub::SetSubtypeOnRemote(MessageParcel &data, MessageParcel &reply)
{ {
IMSA_HILOGI("InputMethodCoreStub::SetSubtypeOnRemote"); IMSA_HILOGD("InputMethodCoreStub::SetSubtypeOnRemote");
SubProperty property; SubProperty property;
int32_t ret = SendMessage(MessageID::MSG_ID_SET_SUBTYPE, [&data, &property](MessageParcel &parcel) { int32_t ret = SendMessage(MessageID::MSG_ID_SET_SUBTYPE, [&data, &property](MessageParcel &parcel) {
return ITypesUtil::Unmarshal(data, property) && ITypesUtil::Marshal(parcel, property); return ITypesUtil::Unmarshal(data, property) && ITypesUtil::Marshal(parcel, property);
@ -324,7 +324,7 @@ int32_t InputMethodCoreStub::SetSubtype(const SubProperty &property)
int32_t InputMethodCoreStub::SendMessage(int code, ParcelHandler input) int32_t InputMethodCoreStub::SendMessage(int code, ParcelHandler input)
{ {
IMSA_HILOGI("InputMethodCoreStub::SendMessage"); IMSA_HILOGD("InputMethodCoreStub::SendMessage");
if (msgHandler_ == nullptr) { if (msgHandler_ == nullptr) {
IMSA_HILOGE("InputMethodCoreStub::msgHandler_ is nullptr"); IMSA_HILOGE("InputMethodCoreStub::msgHandler_ is nullptr");
return ErrorCode::ERROR_EX_NULL_POINTER; return ErrorCode::ERROR_EX_NULL_POINTER;

View File

@ -105,6 +105,7 @@ private:
void OnSwitchInput(const Property &property, const SubProperty &subProperty); void OnSwitchInput(const Property &property, const SubProperty &subProperty);
std::shared_ptr<IInputMethodAgent> GetInputMethodAgent(); std::shared_ptr<IInputMethodAgent> GetInputMethodAgent();
void WorkThread(); void WorkThread();
void QuitWorkThread();
int32_t ListInputMethodCommon(InputMethodStatus status, std::vector<Property> &props); int32_t ListInputMethodCommon(InputMethodStatus status, std::vector<Property> &props);
sptr<IInputDataChannel> mInputDataChannel; sptr<IInputDataChannel> mInputDataChannel;
@ -115,6 +116,7 @@ private:
sptr<ImsaDeathRecipient> deathRecipient_; sptr<ImsaDeathRecipient> deathRecipient_;
std::mutex agentLock_; std::mutex agentLock_;
std::shared_ptr<IInputMethodAgent> mAgent = nullptr; std::shared_ptr<IInputMethodAgent> mAgent = nullptr;
std::mutex textListenerLock_;
sptr<OnTextChangedListener> textListener; sptr<OnTextChangedListener> textListener;
InputAttribute mAttribute; InputAttribute mAttribute;
std::u16string mTextString; std::u16string mTextString;

View File

@ -13,8 +13,8 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef INPUTMETHOD_IMF_INPUT_METHOD_ENGINE_LISTENER_H #ifndef INPUTMETHOD_IMF_INPUT_METHOD_SETTING_LISTENER_H
#define INPUTMETHOD_IMF_INPUT_METHOD_ENGINE_LISTENER_H #define INPUTMETHOD_IMF_INPUT_METHOD_SETTING_LISTENER_H
#include "input_method_property.h" #include "input_method_property.h"
@ -28,4 +28,4 @@ public:
} // namespace MiscServices } // namespace MiscServices
} // namespace OHOS } // namespace OHOS
#endif // INPUTMETHOD_IMF_INPUT_METHOD_ENGINE_LISTENER_H #endif // INPUTMETHOD_IMF_INPUT_METHOD_SETTING_LISTENER_H

View File

@ -43,14 +43,9 @@ using namespace MessageID;
InputMethodController::~InputMethodController() InputMethodController::~InputMethodController()
{ {
if (msgHandler) { QuitWorkThread();
delete msgHandler; delete msgHandler;
msgHandler = nullptr; msgHandler = nullptr;
stop_ = false;
}
if (workThreadHandler.joinable()) {
workThreadHandler.join();
}
} }
sptr<InputMethodController> InputMethodController::GetInstance() sptr<InputMethodController> InputMethodController::GetInstance()
@ -93,10 +88,12 @@ using namespace MessageID;
channel->SetHandler(msgHandler); channel->SetHandler(msgHandler);
mInputDataChannel = channel; mInputDataChannel = channel;
workThreadHandler = std::thread([this] {WorkThread();}); workThreadHandler = std::thread([this] { WorkThread(); });
mAttribute.inputPattern = InputAttribute::PATTERN_TEXT; mAttribute.inputPattern = InputAttribute::PATTERN_TEXT;
{
textListener = nullptr; std::lock_guard<std::mutex> lock(textListenerLock_);
textListener = nullptr;
}
IMSA_HILOGI("InputMethodController::Initialize textListener is nullptr"); IMSA_HILOGI("InputMethodController::Initialize textListener is nullptr");
PrepareInput(0, mClient, mInputDataChannel, mAttribute); PrepareInput(0, mClient, mInputDataChannel, mAttribute);
return true; return true;
@ -139,6 +136,7 @@ using namespace MessageID;
{ {
while (!stop_) { while (!stop_) {
Message *msg = msgHandler->GetMessage(); Message *msg = msgHandler->GetMessage();
std::lock_guard<std::mutex> lock(textListenerLock_);
switch (msg->msgId_) { switch (msg->msgId_) {
case MSG_ID_INSERT_CHAR: { case MSG_ID_INSERT_CHAR: {
MessageParcel *data = msg->msgContent_; MessageParcel *data = msg->msgContent_;
@ -232,8 +230,10 @@ using namespace MessageID;
break; break;
} }
OnSwitchInput(property, subProperty); OnSwitchInput(property, subProperty);
break;
} }
default: { default: {
IMSA_HILOGD("the message is %{public}d.", msg->msgId_);
break; break;
} }
} }
@ -242,6 +242,16 @@ using namespace MessageID;
} }
} }
void InputMethodController::QuitWorkThread()
{
stop_ = true;
Message *msg = new Message(MessageID::MSG_ID_QUIT_WORKER_THREAD, nullptr);
msgHandler->SendMessage(msg);
if (workThreadHandler.joinable()) {
workThreadHandler.join();
}
}
void InputMethodController::OnSwitchInput(const Property &property, const SubProperty &subProperty) void InputMethodController::OnSwitchInput(const Property &property, const SubProperty &subProperty)
{ {
IMSA_HILOGE("InputMethodController::OnSwitchInput"); IMSA_HILOGE("InputMethodController::OnSwitchInput");
@ -259,6 +269,7 @@ using namespace MessageID;
void InputMethodController::Attach(sptr<OnTextChangedListener> &listener, bool isShowKeyboard) void InputMethodController::Attach(sptr<OnTextChangedListener> &listener, bool isShowKeyboard)
{ {
std::lock_guard<std::mutex> lock(textListenerLock_);
textListener = listener; textListener = listener;
IMSA_HILOGI("InputMethodController::Attach"); IMSA_HILOGI("InputMethodController::Attach");
InputmethodTrace tracer("InputMethodController Attach trace."); InputmethodTrace tracer("InputMethodController Attach trace.");
@ -275,13 +286,13 @@ using namespace MessageID;
void InputMethodController::HideTextInput() void InputMethodController::HideTextInput()
{ {
IMSA_HILOGI("InputMethodController::HideTextInput"); IMSA_HILOGD("InputMethodController::HideTextInput");
StopInput(mClient); StopInput(mClient);
} }
int32_t InputMethodController::HideCurrentInput() int32_t InputMethodController::HideCurrentInput()
{ {
IMSA_HILOGI("InputMethodController::HideCurrentInput"); IMSA_HILOGD("InputMethodController::HideCurrentInput");
auto proxy = GetSystemAbilityProxy(); auto proxy = GetSystemAbilityProxy();
if (proxy == nullptr) { if (proxy == nullptr) {
IMSA_HILOGE("proxy is nullptr"); IMSA_HILOGE("proxy is nullptr");
@ -305,8 +316,11 @@ using namespace MessageID;
{ {
ReleaseInput(mClient); ReleaseInput(mClient);
InputmethodTrace tracer("InputMethodController Close trace."); InputmethodTrace tracer("InputMethodController Close trace.");
textListener = nullptr; {
IMSA_HILOGI("InputMethodController::Close"); std::lock_guard<std::mutex> lock(textListenerLock_);
textListener = nullptr;
}
IMSA_HILOGD("InputMethodController::Close");
} }
void InputMethodController::PrepareInput(int32_t displayId, sptr<IInputClient> &client, void InputMethodController::PrepareInput(int32_t displayId, sptr<IInputClient> &client,
@ -357,7 +371,7 @@ using namespace MessageID;
std::shared_ptr<Property> InputMethodController::GetCurrentInputMethod() std::shared_ptr<Property> InputMethodController::GetCurrentInputMethod()
{ {
IMSA_HILOGI("InputMethodController::GetCurrentInputMethod"); IMSA_HILOGD("InputMethodController::GetCurrentInputMethod");
auto proxy = GetSystemAbilityProxy(); auto proxy = GetSystemAbilityProxy();
if (proxy == nullptr) { if (proxy == nullptr) {
IMSA_HILOGE("proxy is nullptr"); IMSA_HILOGE("proxy is nullptr");
@ -373,7 +387,7 @@ using namespace MessageID;
std::shared_ptr<SubProperty> InputMethodController::GetCurrentInputMethodSubtype() std::shared_ptr<SubProperty> InputMethodController::GetCurrentInputMethodSubtype()
{ {
IMSA_HILOGI("InputMethodController::GetCurrentInputMethod"); IMSA_HILOGD("InputMethodController::GetCurrentInputMethod");
auto proxy = GetSystemAbilityProxy(); auto proxy = GetSystemAbilityProxy();
if (proxy == nullptr) { if (proxy == nullptr) {
IMSA_HILOGE("proxy is nullptr"); IMSA_HILOGE("proxy is nullptr");
@ -401,7 +415,7 @@ using namespace MessageID;
void InputMethodController::ReleaseInput(sptr<IInputClient> &client) void InputMethodController::ReleaseInput(sptr<IInputClient> &client)
{ {
IMSA_HILOGI("InputMethodController::ReleaseInput"); IMSA_HILOGD("InputMethodController::ReleaseInput");
isStopInput = true; isStopInput = true;
auto proxy = GetSystemAbilityProxy(); auto proxy = GetSystemAbilityProxy();
if (proxy == nullptr) { if (proxy == nullptr) {
@ -413,7 +427,7 @@ using namespace MessageID;
void InputMethodController::StopInput(sptr<IInputClient> &client) void InputMethodController::StopInput(sptr<IInputClient> &client)
{ {
IMSA_HILOGI("InputMethodController::StopInput"); IMSA_HILOGD("InputMethodController::StopInput");
isStopInput = true; isStopInput = true;
auto proxy = GetSystemAbilityProxy(); auto proxy = GetSystemAbilityProxy();
if (proxy == nullptr) { if (proxy == nullptr) {
@ -502,7 +516,7 @@ using namespace MessageID;
int32_t InputMethodController::GetTextAfterCursor(int32_t number, std::u16string &text) int32_t InputMethodController::GetTextAfterCursor(int32_t number, std::u16string &text)
{ {
IMSA_HILOGI("InputMethodController::GetTextBeforeCursor"); IMSA_HILOGI("InputMethodController::GetTextAfterCursor");
if (!mTextString.empty() && mTextString.size() <= INT_MAX) { if (!mTextString.empty() && mTextString.size() <= INT_MAX) {
int32_t endPos = (mSelectNewEnd + number < static_cast<int32_t>(mTextString.size())) int32_t endPos = (mSelectNewEnd + number < static_cast<int32_t>(mTextString.size()))
? (mSelectNewEnd + number) ? (mSelectNewEnd + number)

View File

@ -39,7 +39,7 @@ int32_t InputMethodSystemAbilityProxy::PrepareInput(int32_t displayId, sptr<IInp
int32_t InputMethodSystemAbilityProxy::StartInput(sptr<IInputClient> client, bool isShowKeyboard) int32_t InputMethodSystemAbilityProxy::StartInput(sptr<IInputClient> client, bool isShowKeyboard)
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
return SendRequest(START_INPUT, [isShowKeyboard, client](MessageParcel &data) { return SendRequest(START_INPUT, [isShowKeyboard, client](MessageParcel &data) {
return data.WriteRemoteObject(client->AsObject()) && data.WriteBool(isShowKeyboard); return data.WriteRemoteObject(client->AsObject()) && data.WriteBool(isShowKeyboard);
}); });
@ -47,25 +47,25 @@ int32_t InputMethodSystemAbilityProxy::StartInput(sptr<IInputClient> client, boo
int32_t InputMethodSystemAbilityProxy::ShowCurrentInput() int32_t InputMethodSystemAbilityProxy::ShowCurrentInput()
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
return SendRequest(SHOW_CURRENT_INPUT); return SendRequest(SHOW_CURRENT_INPUT);
} }
int32_t InputMethodSystemAbilityProxy::HideCurrentInput() int32_t InputMethodSystemAbilityProxy::HideCurrentInput()
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
return SendRequest(HIDE_CURRENT_INPUT); return SendRequest(HIDE_CURRENT_INPUT);
} }
int32_t InputMethodSystemAbilityProxy::StopInputSession() int32_t InputMethodSystemAbilityProxy::StopInputSession()
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
return SendRequest(STOP_INPUT_SESSION); return SendRequest(STOP_INPUT_SESSION);
} }
int32_t InputMethodSystemAbilityProxy::StopInput(sptr<IInputClient> client) int32_t InputMethodSystemAbilityProxy::StopInput(sptr<IInputClient> client)
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
return SendRequest(STOP_INPUT, return SendRequest(STOP_INPUT,
[client](MessageParcel &data) { return data.WriteRemoteObject(client->AsObject()); }); [client](MessageParcel &data) { return data.WriteRemoteObject(client->AsObject()); });
} }
@ -84,7 +84,7 @@ int32_t InputMethodSystemAbilityProxy::DisplayOptionalInputMethod()
int32_t InputMethodSystemAbilityProxy::SetCoreAndAgent(sptr<IInputMethodCore> core, sptr<IInputMethodAgent> agent) int32_t InputMethodSystemAbilityProxy::SetCoreAndAgent(sptr<IInputMethodCore> core, sptr<IInputMethodAgent> agent)
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
return SendRequest(SET_CORE_AND_AGENT, [core, agent](MessageParcel &data) { return SendRequest(SET_CORE_AND_AGENT, [core, agent](MessageParcel &data) {
return data.WriteRemoteObject(core->AsObject()) && data.WriteRemoteObject(agent->AsObject()); return data.WriteRemoteObject(core->AsObject()) && data.WriteRemoteObject(agent->AsObject());
}); });
@ -92,14 +92,14 @@ int32_t InputMethodSystemAbilityProxy::SetCoreAndAgent(sptr<IInputMethodCore> co
int32_t InputMethodSystemAbilityProxy::GetKeyboardWindowHeight(int32_t &retHeight) int32_t InputMethodSystemAbilityProxy::GetKeyboardWindowHeight(int32_t &retHeight)
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
return SendRequest(GET_KEYBOARD_WINDOW_HEIGHT, nullptr, return SendRequest(GET_KEYBOARD_WINDOW_HEIGHT, nullptr,
[&retHeight](MessageParcel &reply) { return reply.ReadInt32(retHeight); }); [&retHeight](MessageParcel &reply) { return reply.ReadInt32(retHeight); });
} }
std::shared_ptr<Property> InputMethodSystemAbilityProxy::GetCurrentInputMethod() std::shared_ptr<Property> InputMethodSystemAbilityProxy::GetCurrentInputMethod()
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
std::shared_ptr<Property> property = nullptr; std::shared_ptr<Property> property = nullptr;
int32_t ret = SendRequest(GET_CURRENT_INPUT_METHOD, nullptr, [&property](MessageParcel &reply) { int32_t ret = SendRequest(GET_CURRENT_INPUT_METHOD, nullptr, [&property](MessageParcel &reply) {
property = std::make_shared<Property>(); property = std::make_shared<Property>();
@ -118,7 +118,7 @@ std::shared_ptr<Property> InputMethodSystemAbilityProxy::GetCurrentInputMethod()
std::shared_ptr<SubProperty> InputMethodSystemAbilityProxy::GetCurrentInputMethodSubtype() std::shared_ptr<SubProperty> InputMethodSystemAbilityProxy::GetCurrentInputMethodSubtype()
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
std::shared_ptr<SubProperty> property = nullptr; std::shared_ptr<SubProperty> property = nullptr;
int32_t ret = SendRequest(GET_CURRENT_INPUT_METHOD_SUBTYPE, nullptr, [&property](MessageParcel &reply) { int32_t ret = SendRequest(GET_CURRENT_INPUT_METHOD_SUBTYPE, nullptr, [&property](MessageParcel &reply) {
property = std::make_shared<SubProperty>(); property = std::make_shared<SubProperty>();
@ -137,7 +137,7 @@ std::shared_ptr<SubProperty> InputMethodSystemAbilityProxy::GetCurrentInputMetho
int32_t InputMethodSystemAbilityProxy::ListInputMethod(InputMethodStatus status, std::vector<Property> &props) int32_t InputMethodSystemAbilityProxy::ListInputMethod(InputMethodStatus status, std::vector<Property> &props)
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
int32_t ret = SendRequest( int32_t ret = SendRequest(
LIST_INPUT_METHOD, [status](MessageParcel &data) { return ITypesUtil::Marshal(data, uint32_t(status)); }, LIST_INPUT_METHOD, [status](MessageParcel &data) { return ITypesUtil::Marshal(data, uint32_t(status)); },
[&props](MessageParcel &reply) { return ITypesUtil::Unmarshal(reply, props); }); [&props](MessageParcel &reply) { return ITypesUtil::Unmarshal(reply, props); });
@ -149,26 +149,26 @@ int32_t InputMethodSystemAbilityProxy::ListInputMethod(InputMethodStatus status,
int32_t InputMethodSystemAbilityProxy::ShowCurrentInputDeprecated() int32_t InputMethodSystemAbilityProxy::ShowCurrentInputDeprecated()
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
return SendRequest(SHOW_CURRENT_INPUT_DEPRECATED); return SendRequest(SHOW_CURRENT_INPUT_DEPRECATED);
} }
int32_t InputMethodSystemAbilityProxy::HideCurrentInputDeprecated() int32_t InputMethodSystemAbilityProxy::HideCurrentInputDeprecated()
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
return SendRequest(HIDE_CURRENT_INPUT_DEPRECATED); return SendRequest(HIDE_CURRENT_INPUT_DEPRECATED);
} }
int32_t InputMethodSystemAbilityProxy::DisplayOptionalInputMethodDeprecated() int32_t InputMethodSystemAbilityProxy::DisplayOptionalInputMethodDeprecated()
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
return SendRequest(DISPLAY_OPTIONAL_INPUT_DEPRECATED); return SendRequest(DISPLAY_OPTIONAL_INPUT_DEPRECATED);
} }
int32_t InputMethodSystemAbilityProxy::SetCoreAndAgentDeprecated(sptr<IInputMethodCore> core, int32_t InputMethodSystemAbilityProxy::SetCoreAndAgentDeprecated(sptr<IInputMethodCore> core,
sptr<IInputMethodAgent> agent) sptr<IInputMethodAgent> agent)
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
return SendRequest(SET_CORE_AND_AGENT_DEPRECATED, [core, agent](MessageParcel &data) { return SendRequest(SET_CORE_AND_AGENT_DEPRECATED, [core, agent](MessageParcel &data) {
return data.WriteRemoteObject(core->AsObject()) && data.WriteRemoteObject(agent->AsObject()); return data.WriteRemoteObject(core->AsObject()) && data.WriteRemoteObject(agent->AsObject());
}); });
@ -177,7 +177,7 @@ int32_t InputMethodSystemAbilityProxy::SetCoreAndAgentDeprecated(sptr<IInputMeth
int32_t InputMethodSystemAbilityProxy::ListInputMethodSubtype( int32_t InputMethodSystemAbilityProxy::ListInputMethodSubtype(
const std::string &name, std::vector<SubProperty> &subProps) const std::string &name, std::vector<SubProperty> &subProps)
{ {
IMSA_HILOGI("InputMethodSystemAbilityProxy::ListInputMethodSubtype"); IMSA_HILOGD("InputMethodSystemAbilityProxy::ListInputMethodSubtype");
int32_t ret = SendRequest( int32_t ret = SendRequest(
LIST_INPUT_METHOD_SUBTYPE, [&name](MessageParcel &data) { return ITypesUtil::Marshal(data, name); }, LIST_INPUT_METHOD_SUBTYPE, [&name](MessageParcel &data) { return ITypesUtil::Marshal(data, name); },
[&subProps](MessageParcel &reply) { return ITypesUtil::Unmarshal(reply, subProps); }); [&subProps](MessageParcel &reply) { return ITypesUtil::Unmarshal(reply, subProps); });
@ -189,7 +189,7 @@ int32_t InputMethodSystemAbilityProxy::ListInputMethodSubtype(
int32_t InputMethodSystemAbilityProxy::ListCurrentInputMethodSubtype(std::vector<SubProperty> &subProps) int32_t InputMethodSystemAbilityProxy::ListCurrentInputMethodSubtype(std::vector<SubProperty> &subProps)
{ {
IMSA_HILOGI("InputMethodSystemAbilityProxy::ListCurrentInputMethodSubtype"); IMSA_HILOGD("InputMethodSystemAbilityProxy::ListCurrentInputMethodSubtype");
int32_t ret = SendRequest(LIST_CURRENT_INPUT_METHOD_SUBTYPE, nullptr, int32_t ret = SendRequest(LIST_CURRENT_INPUT_METHOD_SUBTYPE, nullptr,
[&subProps](MessageParcel &reply) { return ITypesUtil::Unmarshal(reply, subProps); }); [&subProps](MessageParcel &reply) { return ITypesUtil::Unmarshal(reply, subProps); });
if (ret != ErrorCode::NO_ERROR) { if (ret != ErrorCode::NO_ERROR) {
@ -200,14 +200,14 @@ int32_t InputMethodSystemAbilityProxy::ListCurrentInputMethodSubtype(std::vector
int32_t InputMethodSystemAbilityProxy::SwitchInputMethod(const std::string &name, const std::string &subName) int32_t InputMethodSystemAbilityProxy::SwitchInputMethod(const std::string &name, const std::string &subName)
{ {
IMSA_HILOGI("InputMethodSystemAbilityProxy::SwitchInputMethod"); IMSA_HILOGD("InputMethodSystemAbilityProxy::SwitchInputMethod");
return SendRequest(SWITCH_INPUT_METHOD, return SendRequest(SWITCH_INPUT_METHOD,
[&name, &subName](MessageParcel &data) { return ITypesUtil::Marshal(data, name, subName); }); [&name, &subName](MessageParcel &data) { return ITypesUtil::Marshal(data, name, subName); });
} }
int32_t InputMethodSystemAbilityProxy::SendRequest(int code, ParcelHandler input, ParcelHandler output) int32_t InputMethodSystemAbilityProxy::SendRequest(int code, ParcelHandler input, ParcelHandler output)
{ {
IMSA_HILOGI("%{public}s in", __func__); IMSA_HILOGD("%{public}s in", __func__);
MessageParcel data; MessageParcel data;
MessageParcel reply; MessageParcel reply;
MessageOption option{ MessageOption::TF_SYNC }; MessageOption option{ MessageOption::TF_SYNC };

View File

@ -47,19 +47,19 @@ private:
std::unique_ptr<NativeReference> jsConnectionObject_ = nullptr; std::unique_ptr<NativeReference> jsConnectionObject_ = nullptr;
}; };
struct ConnecttionKey { struct ConnectionKey {
AAFwk::Want want; AAFwk::Want want;
int64_t id; int64_t id;
}; };
struct key_compare { struct key_compare {
bool operator()(const ConnecttionKey &key1, const ConnecttionKey &key2) const bool operator()(const ConnectionKey &key1, const ConnectionKey &key2) const
{ {
return key1.id < key2.id; return key1.id < key2.id;
} }
}; };
static std::map<ConnecttionKey, sptr<JSInputMethodExtensionConnection>, key_compare> connects_; static std::map<ConnectionKey, sptr<JSInputMethodExtensionConnection>, key_compare> connects_;
static int64_t serialNumber_ = 0; static int64_t serialNumber_ = 0;
static std::shared_ptr<AppExecFwk::EventHandler> handler_ = nullptr; static std::shared_ptr<AppExecFwk::EventHandler> handler_ = nullptr;
} // namespace AbilityRuntime } // namespace AbilityRuntime

View File

@ -260,7 +260,7 @@ private:
sptr<JSInputMethodExtensionConnection> connection = new JSInputMethodExtensionConnection(engine); sptr<JSInputMethodExtensionConnection> connection = new JSInputMethodExtensionConnection(engine);
connection->SetJsConnectionObject(info.argv[1]); connection->SetJsConnectionObject(info.argv[1]);
int64_t connectId = serialNumber_; int64_t connectId = serialNumber_;
ConnecttionKey key; ConnectionKey key;
key.id = serialNumber_; key.id = serialNumber_;
key.want = want; key.want = want;
connects_.emplace(key, connection); connects_.emplace(key, connection);
@ -316,7 +316,7 @@ private:
sptr<JSInputMethodExtensionConnection> connection = new JSInputMethodExtensionConnection(engine); sptr<JSInputMethodExtensionConnection> connection = new JSInputMethodExtensionConnection(engine);
connection->SetJsConnectionObject(info.argv[1]); connection->SetJsConnectionObject(info.argv[1]);
int64_t connectId = serialNumber_; int64_t connectId = serialNumber_;
ConnecttionKey key; ConnectionKey key;
key.id = serialNumber_; key.id = serialNumber_;
key.want = want; key.want = want;
connects_.emplace(key, connection); connects_.emplace(key, connection);
@ -363,7 +363,7 @@ private:
reinterpret_cast<napi_env>(&engine), reinterpret_cast<napi_value>(info.argv[INDEX_ZERO]), &connectId); reinterpret_cast<napi_env>(&engine), reinterpret_cast<napi_value>(info.argv[INDEX_ZERO]), &connectId);
IMSA_HILOGI("OnDisconnectAbility connection:%{public}d", static_cast<int32_t>(connectId)); IMSA_HILOGI("OnDisconnectAbility connection:%{public}d", static_cast<int32_t>(connectId));
auto item = std::find_if(connects_.begin(), connects_.end(), auto item = std::find_if(connects_.begin(), connects_.end(),
[&connectId](const std::map<ConnecttionKey, [&connectId](const std::map<ConnectionKey,
sptr<JSInputMethodExtensionConnection>>::value_type &obj) { sptr<JSInputMethodExtensionConnection>>::value_type &obj) {
return connectId == obj.first.id; return connectId == obj.first.id;
}); });
@ -596,7 +596,7 @@ void JSInputMethodExtensionConnection::HandleOnAbilityDisconnectDone(
std::string abilityName = element.GetAbilityName(); std::string abilityName = element.GetAbilityName();
auto item = std::find_if(connects_.begin(), connects_.end(), auto item = std::find_if(connects_.begin(), connects_.end(),
[bundleName, abilityName]( [bundleName, abilityName](
const std::map<ConnecttionKey, sptr<JSInputMethodExtensionConnection>>::value_type &obj) { const std::map<ConnectionKey, sptr<JSInputMethodExtensionConnection>>::value_type &obj) {
return (bundleName == obj.first.want.GetBundle()) return (bundleName == obj.first.want.GetBundle())
&& (abilityName == obj.first.want.GetElement().GetAbilityName()); && (abilityName == obj.first.want.GetElement().GetAbilityName());
}); });

View File

@ -41,7 +41,7 @@ extern "C" __attribute__((visibility("default"))) void NAPI_inputmethodextension
} }
} }
// inputmethod_extension_abiltiy JS register // inputmethod_extension_ability JS register
extern "C" __attribute__((visibility("default"))) void NAPI_inputmethodextensionability_GetABCCode( extern "C" __attribute__((visibility("default"))) void NAPI_inputmethodextensionability_GetABCCode(
const char **buf, int *buflen) const char **buf, int *buflen)
{ {

View File

@ -13,7 +13,7 @@
* limitations under the License. * limitations under the License.
*/ */
var ExtensionContext = requireNapi("application.ExtensionContext") const ExtensionContext = requireNapi("application.ExtensionContext");
class InputMethodExtensionContext extends ExtensionContext { class InputMethodExtensionContext extends ExtensionContext {
constructor(obj) { constructor(obj) {

View File

@ -12,8 +12,8 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
#ifndef CALLBAKC_OBJECT_H #ifndef JS_CALLBACK_OBJECT_H
#define CALLBAKC_OBJECT_H #define JS_CALLBACK_OBJECT_H
#include <thread> #include <thread>
@ -32,4 +32,4 @@ public:
}; };
} // namespace MiscServices } // namespace MiscServices
} // namespace OHOS } // namespace OHOS
#endif // CALLBAKC_OBJECT_H #endif // JS_CALLBACK_OBJECT_H

View File

@ -226,7 +226,7 @@ void JsInputMethodEngineSetting::RegisterListener(napi_value callback, std::stri
IMSA_HILOGI("RegisterListener %{public}s", type.c_str()); IMSA_HILOGI("RegisterListener %{public}s", type.c_str());
std::lock_guard<std::recursive_mutex> lock(mutex_); std::lock_guard<std::recursive_mutex> lock(mutex_);
if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) { if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
IMSA_HILOGE("methodName: %{public}s not registertd!", type.c_str()); IMSA_HILOGE("methodName: %{public}s not registered!", type.c_str());
} }
for (auto &item : jsCbMap_[type]) { for (auto &item : jsCbMap_[type]) {
@ -245,7 +245,7 @@ void JsInputMethodEngineSetting::UnRegisterListener(napi_value callback, std::st
IMSA_HILOGI("UnRegisterListener %{public}s", type.c_str()); IMSA_HILOGI("UnRegisterListener %{public}s", type.c_str());
std::lock_guard<std::recursive_mutex> lock(mutex_); std::lock_guard<std::recursive_mutex> lock(mutex_);
if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) { if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
IMSA_HILOGE("methodName: %{public}s already unRegisterted!", type.c_str()); IMSA_HILOGE("methodName: %{public}s already unRegistered!", type.c_str());
return; return;
} }
@ -255,7 +255,7 @@ void JsInputMethodEngineSetting::UnRegisterListener(napi_value callback, std::st
return; return;
} }
for (auto item = jsCbMap_[type].begin(); item != jsCbMap_[type].end();) { for (auto item = jsCbMap_[type].begin(); item != jsCbMap_[type].end(); item++) {
if (Equals((*item)->env_, callback, (*item)->callback_, (*item)->threadId_)) { if (Equals((*item)->env_, callback, (*item)->callback_, (*item)->threadId_)) {
jsCbMap_[type].erase(item); jsCbMap_[type].erase(item);
break; break;
@ -734,7 +734,7 @@ void JsInputMethodEngineSetting::OnSetSubtype(const SubProperty &property)
for (auto item : entry->vecCopy) { for (auto item : entry->vecCopy) {
napi_value jsObject = GetResultOnSetSubtype(item->env_, entry->subProperty); napi_value jsObject = GetResultOnSetSubtype(item->env_, entry->subProperty);
if (jsObject == nullptr) { if (jsObject == nullptr) {
IMSA_HILOGE("get GetResultOnSetSubtype failed: %{punlic}p", jsObject); IMSA_HILOGE("get GetResultOnSetSubtype failed: jsObject is nullptr");
continue; continue;
} }
napi_value callback = nullptr; napi_value callback = nullptr;

View File

@ -195,7 +195,7 @@ void JsKeyboardDelegateSetting::UnRegisterListener(napi_value callback, std::str
IMSA_HILOGI("UnRegisterListener %{public}s", type.c_str()); IMSA_HILOGI("UnRegisterListener %{public}s", type.c_str());
std::lock_guard<std::recursive_mutex> lock(mutex_); std::lock_guard<std::recursive_mutex> lock(mutex_);
if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) { if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
IMSA_HILOGE("methodName %{public}s not unRegisterted!", type.c_str()); IMSA_HILOGE("methodName %{public}s not unRegistered!", type.c_str());
return; return;
} }
@ -205,7 +205,7 @@ void JsKeyboardDelegateSetting::UnRegisterListener(napi_value callback, std::str
return; return;
} }
for (auto item = jsCbMap_[type].begin(); item != jsCbMap_[type].end();) { for (auto item = jsCbMap_[type].begin(); item != jsCbMap_[type].end(); item++) {
if ((callback != nullptr) && (Equals((*item)->env_, callback, (*item)->callback_, (*item)->threadId_))) { if ((callback != nullptr) && (Equals((*item)->env_, callback, (*item)->callback_, (*item)->threadId_))) {
jsCbMap_[type].erase(item); jsCbMap_[type].erase(item);
break; break;
@ -375,7 +375,7 @@ bool JsKeyboardDelegateSetting::OnKeyEvent(int32_t keyCode, int32_t keyStatus)
napi_value jsObject = napi_value jsObject =
GetResultOnKeyEvent(item->env_, entry->keyEventPara.keyCode, entry->keyEventPara.keyStatus); GetResultOnKeyEvent(item->env_, entry->keyEventPara.keyCode, entry->keyEventPara.keyStatus);
if (jsObject == nullptr) { if (jsObject == nullptr) {
IMSA_HILOGE("get GetResultOnKeyEvent failed: %{punlic}p", jsObject); IMSA_HILOGE("get GetResultOnKeyEvent failed: jsObject is nullptr");
continue; continue;
} }
napi_value callback = nullptr; napi_value callback = nullptr;
@ -643,4 +643,4 @@ void JsKeyboardDelegateSetting::OnTextChange(std::string text)
}); });
} }
} // namespace MiscServices } // namespace MiscServices
} // namespace OHOS } // namespace OHOS

View File

@ -76,7 +76,7 @@ napi_value JsTextInputClientEngine::MoveCursor(napi_env env, napi_callback_info
} }
}; };
ctxt->SetAction(std::move(input)); ctxt->SetAction(std::move(input));
AsyncCall asyncCall(env, info, std::dynamic_pointer_cast<AsyncCall::Context>(ctxt), 0); AsyncCall asyncCall(env, info, std::dynamic_pointer_cast<AsyncCall::Context>(ctxt));
return asyncCall.Call(env, exec); return asyncCall.Call(env, exec);
} }

View File

@ -45,7 +45,7 @@ struct SendKeyFunctionContext : public AsyncCall::Context {
}; };
struct MoveCursorContext : public AsyncCall::Context { struct MoveCursorContext : public AsyncCall::Context {
bool num = false; int32_t num = 0;
napi_status status = napi_generic_failure; napi_status status = napi_generic_failure;
MoveCursorContext() : Context(nullptr, nullptr){}; MoveCursorContext() : Context(nullptr, nullptr){};
MoveCursorContext(InputAction input, OutputAction output) : Context(std::move(input), std::move(output)){}; MoveCursorContext(InputAction input, OutputAction output) : Context(std::move(input), std::move(output)){};

View File

@ -12,8 +12,8 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
#ifndef INTERFACE_KITS_JS_GETINPUT_METHOD_CCONTROLLER_H #ifndef INTERFACE_KITS_JS_GET_INPUT_METHOD_CONTROLLER_H
#define INTERFACE_KITS_JS_GETINPUT_METHOD_CCONTROLLER_H #define INTERFACE_KITS_JS_GET_INPUT_METHOD_CONTROLLER_H
#include "async_call.h" #include "async_call.h"
#include "global.h" #include "global.h"
@ -63,4 +63,4 @@ private:
}; };
} // namespace MiscServices } // namespace MiscServices
} // namespace OHOS } // namespace OHOS
#endif // INTERFACE_KITS_JS_GETINPUT_METHOD_CCONTROLLER_H #endif // INTERFACE_KITS_JS_GET_INPUT_METHOD_CONTROLLER_H

View File

@ -427,7 +427,7 @@ void JsGetInputMethodSetting::RegisterListener(
IMSA_HILOGI("RegisterListener %{public}s", type.c_str()); IMSA_HILOGI("RegisterListener %{public}s", type.c_str());
std::lock_guard<std::recursive_mutex> lock(mutex_); std::lock_guard<std::recursive_mutex> lock(mutex_);
if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) { if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
IMSA_HILOGE("methodName: %{public}s not registertd!", type.c_str()); IMSA_HILOGE("methodName: %{public}s not registered!", type.c_str());
} }
for (auto &item : jsCbMap_[type]) { for (auto &item : jsCbMap_[type]) {
@ -478,7 +478,7 @@ void JsGetInputMethodSetting::UnRegisterListener(napi_value callback, std::strin
IMSA_HILOGI("UnRegisterListener %{public}s", type.c_str()); IMSA_HILOGI("UnRegisterListener %{public}s", type.c_str());
std::lock_guard<std::recursive_mutex> lock(mutex_); std::lock_guard<std::recursive_mutex> lock(mutex_);
if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) { if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
IMSA_HILOGE("methodName: %{public}s already unRegisterted!", type.c_str()); IMSA_HILOGE("methodName: %{public}s already unRegistered!", type.c_str());
return; return;
} }
@ -488,7 +488,7 @@ void JsGetInputMethodSetting::UnRegisterListener(napi_value callback, std::strin
return; return;
} }
for (auto item = jsCbMap_[type].begin(); item != jsCbMap_[type].end();) { for (auto item = jsCbMap_[type].begin(); item != jsCbMap_[type].end(); item++) {
if (Equals((*item)->env_, callback, (*item)->callback_, (*item)->threadId_)) { if (Equals((*item)->env_, callback, (*item)->callback_, (*item)->threadId_)) {
jsCbMap_[type].erase(item); jsCbMap_[type].erase(item);
break; break;

View File

@ -20,9 +20,7 @@ namespace MiscServices {
const std::map<int32_t, int32_t> JsUtils::ERROR_CODE_MAP = { const std::map<int32_t, int32_t> JsUtils::ERROR_CODE_MAP = {
{ ErrorCode::ERROR_STATUS_PERMISSION_DENIED, EXCEPTION_PERMISSION }, { ErrorCode::ERROR_STATUS_PERMISSION_DENIED, EXCEPTION_PERMISSION },
{ ErrorCode::ERROR_REMOTE_IME_DIED, EXCEPTION_IMENGINE }, { ErrorCode::ERROR_REMOTE_IME_DIED, EXCEPTION_IMENGINE },
{ ErrorCode::ERROR_RESTART_IME_FAILED, EXCEPTION_IMENGINE },
{ ErrorCode::ERROR_REMOTE_CLIENT_DIED, EXCEPTION_IMCLIENT }, { ErrorCode::ERROR_REMOTE_CLIENT_DIED, EXCEPTION_IMCLIENT },
{ ErrorCode::ERROR_CLIENT_DUPLICATED, EXCEPTION_IMCLIENT },
{ ErrorCode::ERROR_CLIENT_NOT_FOUND, EXCEPTION_IMCLIENT }, { ErrorCode::ERROR_CLIENT_NOT_FOUND, EXCEPTION_IMCLIENT },
{ ErrorCode::ERROR_CLIENT_NULL_POINTER, EXCEPTION_IMCLIENT }, { ErrorCode::ERROR_CLIENT_NULL_POINTER, EXCEPTION_IMCLIENT },
{ ErrorCode::ERROR_NOT_IME_PACKAGE, EXCEPTION_SETTINGS }, { ErrorCode::ERROR_NOT_IME_PACKAGE, EXCEPTION_SETTINGS },
@ -42,19 +40,11 @@ const std::map<int32_t, int32_t> JsUtils::ERROR_CODE_MAP = {
{ ErrorCode::ERROR_IME_BIND_FAILED, EXCEPTION_IMMS }, { ErrorCode::ERROR_IME_BIND_FAILED, EXCEPTION_IMMS },
{ ErrorCode::ERROR_IME_UNBIND_FAILED, EXCEPTION_IMMS }, { ErrorCode::ERROR_IME_UNBIND_FAILED, EXCEPTION_IMMS },
{ ErrorCode::ERROR_IME_START_FAILED, EXCEPTION_IMMS }, { ErrorCode::ERROR_IME_START_FAILED, EXCEPTION_IMMS },
{ ErrorCode::ERROR_IME_STOP_FAILED, EXCEPTION_IMMS },
{ ErrorCode::ERROR_KBD_SHOW_FAILED, EXCEPTION_IMMS }, { ErrorCode::ERROR_KBD_SHOW_FAILED, EXCEPTION_IMMS },
{ ErrorCode::ERROR_KBD_HIDE_FAILED, EXCEPTION_IMMS }, { ErrorCode::ERROR_KBD_HIDE_FAILED, EXCEPTION_IMMS },
{ ErrorCode::ERROR_IME_NOT_STARTED, EXCEPTION_IMMS }, { ErrorCode::ERROR_IME_NOT_STARTED, EXCEPTION_IMMS },
{ ErrorCode::ERROR_KBD_IS_OCCUPIED, EXCEPTION_IMMS }, { ErrorCode::ERROR_KBD_IS_OCCUPIED, EXCEPTION_IMMS },
{ ErrorCode::ERROR_KBD_IS_NOT_SHOWING, EXCEPTION_IMMS }, { ErrorCode::ERROR_KBD_IS_NOT_SHOWING, EXCEPTION_IMMS },
{ ErrorCode::ERROR_IME_ALREADY_STARTED, EXCEPTION_IMMS },
{ ErrorCode::ERROR_NO_NEXT_IME, EXCEPTION_IMMS },
{ ErrorCode::ERROR_CLIENTWINDOW_NOT_FOCUSED, EXCEPTION_IMMS },
{ ErrorCode::ERROR_CLIENT_NOT_WINDOW, EXCEPTION_IMMS },
{ ErrorCode::ERROR_IME_PROPERTY_MARSHALL, EXCEPTION_IMMS },
{ ErrorCode::ERROR_GETTING_CURRENT_IME, EXCEPTION_IMMS },
{ ErrorCode::ERROR_LIST_IME, EXCEPTION_IMMS },
{ ErrorCode::ERROR_EX_NULL_POINTER, EXCEPTION_IMMS }, { ErrorCode::ERROR_EX_NULL_POINTER, EXCEPTION_IMMS },
{ ErrorCode::ERROR_PERSIST_CONFIG, EXCEPTION_CONFPERSIST }, { ErrorCode::ERROR_PERSIST_CONFIG, EXCEPTION_CONFPERSIST },
{ ErrorCode::ERROR_PACKAGE_MANAGER, EXCEPTION_PACKAGEMANAGER }, { ErrorCode::ERROR_PACKAGE_MANAGER, EXCEPTION_PACKAGEMANAGER },
@ -83,86 +73,85 @@ const std::map<int32_t, int32_t> JsUtils::ERROR_CODE_MAP = {
}; };
const std::map<int32_t, std::string> JsUtils::ERROR_CODE_CONVERT_MESSAGE_MAP = { const std::map<int32_t, std::string> JsUtils::ERROR_CODE_CONVERT_MESSAGE_MAP = {
{ EXCEPTION_PERMISSION, "the permissions check fails." }, { EXCEPTION_PERMISSION, "the permissions check fails." },
{ EXCEPTION_PARAMCHECK, "the parameters check fails." }, { EXCEPTION_PARAMCHECK, "the parameters check fails." },
{ EXCEPTION_UNSUPPORTED, "call unsupported api." }, { EXCEPTION_UNSUPPORTED, "call unsupported api." },
{ EXCEPTION_PACKAGEMANAGER, "package manager error." }, { EXCEPTION_PACKAGEMANAGER, "package manager error." },
{ EXCEPTION_IMENGINE, "input method engine error." }, { EXCEPTION_IMENGINE, "input method engine error." },
{ EXCEPTION_IMCLIENT, "input method client error." }, { EXCEPTION_IMCLIENT, "input method client error." },
{ EXCEPTION_KEYEVENT, "key event processing error." }, { EXCEPTION_KEYEVENT, "key event processing error." },
{ EXCEPTION_CONFPERSIST, "configuration persisting error." }, { EXCEPTION_CONFPERSIST, "configuration persisting error." },
{ EXCEPTION_CONTROLLER, "input method controller error." }, { EXCEPTION_CONTROLLER, "input method controller error." },
{ EXCEPTION_SETTINGS, "input method settings extension error." }, { EXCEPTION_SETTINGS, "input method settings extension error." },
{ EXCEPTION_IMMS, "input method manager service error." }, { EXCEPTION_IMMS, "input method manager service error." },
{ EXCEPTION_OTHERS, "others error." }, { EXCEPTION_OTHERS, "others error." },
}; };
const std::map<int32_t, std::string> JsUtils::PARAMETER_TYPE = { const std::map<int32_t, std::string> JsUtils::PARAMETER_TYPE = {
{ TYPE_UNDEFINED, "napi_undefine." }, { TYPE_UNDEFINED, "napi_undefine." },
{ TYPE_NULL, "napi_null." }, { TYPE_NULL, "napi_null." },
{ TYPE_BOOLEAN, "napi_boolean." }, { TYPE_BOOLEAN, "napi_boolean." },
{ TYPE_NUMBER, "napi_number." }, { TYPE_NUMBER, "napi_number." },
{ TYPE_STRING, "napi_string." }, { TYPE_STRING, "napi_string." },
{ TYPE_SYMBOL, "napi_symbol." }, { TYPE_SYMBOL, "napi_symbol." },
{ TYPE_OBJECT, "napi_object." }, { TYPE_OBJECT, "napi_object." },
{ TYPE_FUNCTION, "napi_function." }, { TYPE_FUNCTION, "napi_function." },
{ TYPE_EXTERNAL, "napi_external." }, { TYPE_EXTERNAL, "napi_external." },
{ TYPE_BIGINT, "napi_bigint." }, { TYPE_BIGINT, "napi_bigint." },
}; };
void JsUtils::ThrowException(napi_env env, int32_t err, const std::string &msg, TypeCode type) void JsUtils::ThrowException(napi_env env, int32_t err, const std::string &msg, TypeCode type)
{ {
std::string errMsg = ToMessage(err); std::string errMsg = ToMessage(err);
if (type == TypeCode::TYPE_NONE) { if (type == TypeCode::TYPE_NONE) {
errMsg = errMsg + msg; errMsg = errMsg + msg;
IMSA_HILOGE("THROW_PARAMTER_ERROR message: %{public}s", errMsg.c_str()); IMSA_HILOGE("THROW_PARAMETER_ERROR message: %{public}s", errMsg.c_str());
} else { } else {
auto iter = PARAMETER_TYPE.find(type); auto iter = PARAMETER_TYPE.find(type);
if (iter != PARAMETER_TYPE.end()) { if (iter != PARAMETER_TYPE.end()) {
errMsg = errMsg + "The type of " + msg + " must be " + iter->second; errMsg = errMsg + "The type of " + msg + " must be " + iter->second;
IMSA_HILOGE("THROW_PARAMTER_TYPE_ERROR message: %{public}s", errMsg.c_str()); IMSA_HILOGE("THROW_PARAMETER_TYPE_ERROR message: %{public}s", errMsg.c_str());
}
} }
napi_throw_error(env, std::to_string(err).c_str(), errMsg.c_str());
}
napi_value JsUtils::ToError(napi_env env, int32_t code)
{
IMSA_HILOGE("ToError start");
napi_value errorObj;
NAPI_CALL(env, napi_create_object(env, &errorObj));
napi_value errorCode = nullptr;
NAPI_CALL(
env, napi_create_string_utf8(env, std::to_string(Convert(code)).c_str(), NAPI_AUTO_LENGTH, &errorCode));
napi_value errorMessage = nullptr;
NAPI_CALL(env, napi_create_string_utf8(env, ToMessage(Convert(code)).c_str(), NAPI_AUTO_LENGTH, &errorMessage));
NAPI_CALL(env, napi_set_named_property(env, errorObj, "code", errorCode));
NAPI_CALL(env, napi_set_named_property(env, errorObj, "message", errorMessage));
IMSA_HILOGE("ToError end");
return errorObj;
}
int32_t JsUtils::Convert(int32_t code)
{
IMSA_HILOGI("Convert start");
auto iter = ERROR_CODE_MAP.find(code);
if (iter != ERROR_CODE_MAP.end()) {
IMSA_HILOGE("ErrorCode: %{public}d", iter->second);
return iter->second;
}
IMSA_HILOGI("Convert end");
return ERROR_CODE_QUERY_FAILED;
}
const std::string JsUtils::ToMessage(int32_t code)
{
IMSA_HILOGI("ToMessage start");
auto iter = ERROR_CODE_CONVERT_MESSAGE_MAP.find(code);
if (iter != ERROR_CODE_CONVERT_MESSAGE_MAP.end()) {
IMSA_HILOGI("ErrorMessage: %{public}s", (iter->second).c_str());
return iter->second;
}
return "error is out of definition.";
} }
napi_throw_error(env, std::to_string(err).c_str(), errMsg.c_str());
} }
}
napi_value JsUtils::ToError(napi_env env, int32_t code)
{
IMSA_HILOGE("ToError start");
napi_value errorObj;
NAPI_CALL(env, napi_create_object(env, &errorObj));
napi_value errorCode = nullptr;
NAPI_CALL(env, napi_create_string_utf8(env, std::to_string(Convert(code)).c_str(), NAPI_AUTO_LENGTH, &errorCode));
napi_value errorMessage = nullptr;
NAPI_CALL(env, napi_create_string_utf8(env, ToMessage(Convert(code)).c_str(), NAPI_AUTO_LENGTH, &errorMessage));
NAPI_CALL(env, napi_set_named_property(env, errorObj, "code", errorCode));
NAPI_CALL(env, napi_set_named_property(env, errorObj, "message", errorMessage));
IMSA_HILOGE("ToError end");
return errorObj;
}
int32_t JsUtils::Convert(int32_t code)
{
IMSA_HILOGI("Convert start");
auto iter = ERROR_CODE_MAP.find(code);
if (iter != ERROR_CODE_MAP.end()) {
IMSA_HILOGE("ErrorCode: %{public}d", iter->second);
return iter->second;
}
IMSA_HILOGI("Convert end");
return ERROR_CODE_QUERY_FAILED;
}
const std::string JsUtils::ToMessage(int32_t code)
{
IMSA_HILOGI("ToMessage start");
auto iter = ERROR_CODE_CONVERT_MESSAGE_MAP.find(code);
if (iter != ERROR_CODE_CONVERT_MESSAGE_MAP.end()) {
IMSA_HILOGI("ErrorMessage: %{public}s", (iter->second).c_str());
return iter->second;
}
return "error is out of definition.";
}
} // namespace MiscServices
} // namespace OHOS

View File

@ -23,6 +23,7 @@ config("inputmethod_services_native_config") {
"//base/notification/common_event_service/frameworks/core/include", "//base/notification/common_event_service/frameworks/core/include",
"//base/notification/common_event_service/interfaces/innerkits/native/include", "//base/notification/common_event_service/interfaces/innerkits/native/include",
"//foundation/multimodalinput/input/interfaces/native/innerkits/event/include", "//foundation/multimodalinput/input/interfaces/native/innerkits/event/include",
"${inputmethod_path}/services/adapter/keyboard/include",
"${inputmethod_path}/services/dfx/include", "${inputmethod_path}/services/dfx/include",
] ]
@ -57,7 +58,6 @@ ohos_shared_library("inputmethod_service") {
deps = [ deps = [
"${ability_runtime_inner_api_path}/ability_manager:ability_manager", "${ability_runtime_inner_api_path}/ability_manager:ability_manager",
"${ability_runtime_services_path}/abilitymgr:abilityms",
"${inputmethod_path}/services/adapter/keyboard:keboard_event_static", "${inputmethod_path}/services/adapter/keyboard:keboard_event_static",
"${inputmethod_path}/services/dfx:inputmethod_dfx_static", "${inputmethod_path}/services/dfx:inputmethod_dfx_static",
"//base/global/resource_management/frameworks/resmgr:global_resmgr", "//base/global/resource_management/frameworks/resmgr:global_resmgr",

View File

@ -23,7 +23,10 @@ config("inputmethod_adapter_native_config") {
} }
ohos_static_library("keboard_event_static") { ohos_static_library("keboard_event_static") {
sources = [ "keyboard_event.cpp" ] sources = [
"src/input_event_callback.cpp",
"src/keyboard_event.cpp",
]
configs = [ ":inputmethod_adapter_native_config" ] configs = [ ":inputmethod_adapter_native_config" ]

View File

@ -0,0 +1,43 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef INPUTMETHOD_IMF_INPUT_EVENT_CALLBACK_H
#define INPUTMETHOD_IMF_INPUT_EVENT_CALLBACK_H
#include <map>
#include <mutex>
#include <utility>
#include "input_manager.h"
#include "key_event.h"
#include "keyboard_event.h"
namespace OHOS {
namespace MiscServices {
class InputEventCallback : public MMI::IInputEventConsumer {
public:
virtual void OnInputEvent(std::shared_ptr<MMI::KeyEvent> keyEvent) const;
virtual void OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const;
virtual void OnInputEvent(std::shared_ptr<MMI::AxisEvent> axisEvent) const;
void SetKeyHandle(KeyHandle handle);
private:
KeyHandle keyHandler_ = nullptr;
static uint32_t keyState_;
};
} // namespace MiscServices
} // namespace OHOS
#endif // INPUTMETHOD_IMF_INPUT_EVENT_CALLBACK_H

View File

@ -20,21 +20,26 @@
#include <functional> #include <functional>
#include <set> #include <set>
namespace OHOS ::MiscServices { #include "global.h"
#include "key_event.h"
struct CombineKey { namespace OHOS {
std::set<int32_t> preKeys; namespace MiscServices {
int32_t finalKey; using KeyHandle = std::function<int32_t(uint32_t)>;
};
enum CombineKeyCode : uint32_t { COMBINE_KEYCODE_CAPS = 0, COMBINE_KEYCODE_SHIFT, COMBINE_KEYCODE_CTRL_SHIFT };
using KeyHandle = std::function<void()>;
class KeyboardEvent { class KeyboardEvent {
public: public:
static KeyboardEvent &GetInstance(); static KeyboardEvent &GetInstance();
int32_t SubscribeKeyboardEvent(const CombineKey &combine, KeyHandle handle); static int32_t AddKeyEventMonitor(KeyHandle handle);
static constexpr uint8_t SHIFT_LEFT_MASK = 0X1;
static constexpr uint8_t SHIFT_RIGHT_MASK = 0X1 << 1;
static constexpr uint8_t CTRL_LEFT_MASK = 0X1 << 2;
static constexpr uint8_t CTRL_RIGHT_MASK = 0X1 << 3;
static constexpr uint8_t CAPS_MASK = 0X1 << 4;
static constexpr bool IS_KEYS_DOWN(uint32_t state, uint8_t mask)
{
return state == mask;
}
private: private:
static constexpr int32_t PRESS_KEY_DELAY_MS = 200; static constexpr int32_t PRESS_KEY_DELAY_MS = 200;
@ -44,11 +49,6 @@ private:
KeyboardEvent &operator=(const KeyboardEvent &) = delete; KeyboardEvent &operator=(const KeyboardEvent &) = delete;
KeyboardEvent &operator=(KeyboardEvent &&) = delete; KeyboardEvent &operator=(KeyboardEvent &&) = delete;
}; };
} // namespace MiscServices
struct KeyboardEventHandler { } // namespace OHOS
CombineKey combine;
KeyHandle handle;
};
} // namespace OHOS::MiscServices
#endif // IMF_KEYBOARD_EVENT_H #endif // IMF_KEYBOARD_EVENT_H

View File

@ -1,56 +0,0 @@
/*
* Copyright (C) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "keyboard_event.h"
#include <global.h>
#include <input_manager.h>
#include <key_event.h>
#include <memory>
#include "global.h"
namespace OHOS::MiscServices {
using namespace MMI;
KeyboardEvent &KeyboardEvent::GetInstance()
{
static KeyboardEvent keyboardEvent;
return keyboardEvent;
}
int32_t KeyboardEvent::SubscribeKeyboardEvent(const CombineKey &combine, KeyHandle handle)
{
std::shared_ptr<KeyOption> keyOption = std::make_shared<KeyOption>();
keyOption->SetPreKeys(combine.preKeys);
keyOption->SetFinalKey(combine.finalKey);
keyOption->SetFinalKeyDown(true);
keyOption->SetFinalKeyDownDuration(0);
auto ret =
InputManager::GetInstance()->SubscribeKeyEvent(keyOption, [this, handle](std::shared_ptr<KeyEvent> keyEvent) {
auto pressKeys = keyEvent->GetPressedKeys();
for (auto &key : pressKeys) {
IMSA_HILOGI("key code: %{public}d", key);
}
if (handle != nullptr) {
handle();
}
});
IMSA_HILOGI("subscribe %{public}d key event %{public}s", combine.finalKey, ret >= 0 ? "OK" : "ERROR");
return ret >= 0 ? ErrorCode::NO_ERROR : ErrorCode::ERROR_SUBSCRIBE_KEYBOARD_EVENT;
}
} // namespace OHOS::MiscServices

View File

@ -0,0 +1,70 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "input_event_callback.h"
#include "global.h"
namespace OHOS {
namespace MiscServices {
uint32_t InputEventCallback::keyState_ = static_cast<uint32_t>(0);
const std::map<int32_t, uint8_t> MASK_MAP{
{ MMI::KeyEvent::KEYCODE_SHIFT_LEFT, KeyboardEvent::SHIFT_LEFT_MASK },
{ MMI::KeyEvent::KEYCODE_SHIFT_RIGHT, KeyboardEvent::SHIFT_RIGHT_MASK },
{ MMI::KeyEvent::KEYCODE_CTRL_LEFT, KeyboardEvent::CTRL_LEFT_MASK },
{ MMI::KeyEvent::KEYCODE_CTRL_RIGHT, KeyboardEvent::CTRL_RIGHT_MASK },
{ MMI::KeyEvent::KEYCODE_CAPS_LOCK, KeyboardEvent::CAPS_MASK },
};
void InputEventCallback::OnInputEvent(std::shared_ptr<MMI::KeyEvent> keyEvent) const
{
auto keyCode = keyEvent->GetKeyCode();
auto keyAction = keyEvent->GetKeyAction();
auto currKey = MASK_MAP.find(keyCode);
if (currKey == MASK_MAP.end()) {
IMSA_HILOGD("key code unknown");
return;
}
IMSA_HILOGD("keyCode: %{public}d, keyAction: %{public}d", keyCode, keyAction);
if (keyAction == MMI::KeyEvent::KEY_ACTION_DOWN) {
IMSA_HILOGD("key %{public}d pressed down", keyCode);
keyState_ = static_cast<uint32_t>(keyState_ | currKey->second);
return;
}
if (keyAction == MMI::KeyEvent::KEY_ACTION_UP) {
if (keyHandler_ != nullptr) {
int32_t ret = keyHandler_(keyState_);
IMSA_HILOGI("handle key event ret: %{public}d", ret);
}
keyState_ = static_cast<uint32_t>(keyState_ & ~currKey->second);
}
}
void InputEventCallback::OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const
{
}
void InputEventCallback::OnInputEvent(std::shared_ptr<MMI::AxisEvent> axisEvent) const
{
}
void InputEventCallback::SetKeyHandle(KeyHandle handle)
{
keyHandler_ = std::move(handle);
}
} // namespace MiscServices
} // namespace OHOS

View File

@ -0,0 +1,51 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "keyboard_event.h"
#include <global.h>
#include <memory>
#include "global.h"
#include "input_event_callback.h"
#include "key_event.h"
namespace OHOS {
namespace MiscServices {
using namespace MMI;
KeyboardEvent &KeyboardEvent::GetInstance()
{
static KeyboardEvent keyboardEvent;
return keyboardEvent;
}
int32_t KeyboardEvent::AddKeyEventMonitor(KeyHandle handle)
{
IMSA_HILOGI("KeyboardEvent::AddKeyEventMonitor");
std::shared_ptr<InputEventCallback> callback = std::make_shared<InputEventCallback>();
callback->SetKeyHandle(handle);
int32_t monitorId =
InputManager::GetInstance()->AddMonitor(std::static_pointer_cast<MMI::IInputEventConsumer>(callback));
if (monitorId < 0) {
IMSA_HILOGE("add monitor failed, id: %{public}d", monitorId);
return ErrorCode::ERROR_SUBSCRIBE_KEYBOARD_EVENT;
}
IMSA_HILOGD("add monitor success, id: %{public}d", monitorId);
return ErrorCode::NO_ERROR;
}
} // namespace MiscServices
} // namespace OHOS

View File

@ -38,7 +38,7 @@ public:
private: private:
void ShowHelp(int fd); void ShowHelp(int fd);
void ShowIllealInfomation(int fd); void ShowIllealInformation(int fd);
mutable std::mutex hidumperMutex_; mutable std::mutex hidumperMutex_;
std::list<std::string> errorInfo_; std::list<std::string> errorInfo_;
DumpNoParamFunc dumpAllMethod_; DumpNoParamFunc dumpAllMethod_;

View File

@ -22,7 +22,7 @@
namespace OHOS { namespace OHOS {
namespace MiscServices { namespace MiscServices {
void FaultReporter(int32_t userId, std::string bundname, int32_t errCode); void FaultReporter(int32_t userId, std::string bundleName, int32_t errCode);
void CreateComponentFailed(int32_t userId, int32_t errCode); void CreateComponentFailed(int32_t userId, int32_t errCode);
void BehaviourReporter(std::string ActiveName, const std::string &inputmethodName); void BehaviourReporter(std::string ActiveName, const std::string &inputmethodName);
} // namespace MiscServices } // namespace MiscServices

View File

@ -25,7 +25,7 @@
namespace OHOS { namespace OHOS {
namespace MiscServices { namespace MiscServices {
constexpr int32_t MAX_RECORED_ERROR = 10; constexpr int32_t MAX_RECORD_ERROR = 10;
constexpr int32_t SUB_CMD_NAME = 0; constexpr int32_t SUB_CMD_NAME = 0;
constexpr int32_t CMD_ONE_PARAM = 1; constexpr int32_t CMD_ONE_PARAM = 1;
constexpr const char *CMD_HELP = "-h"; constexpr const char *CMD_HELP = "-h";
@ -43,7 +43,7 @@ void InputmethodDump::AddDumpAllMethod(const DumpNoParamFunc dumpAllMethod)
void InputmethodDump::AddErrorInfo(const std::string &error) void InputmethodDump::AddErrorInfo(const std::string &error)
{ {
std::lock_guard<std::mutex> lock(hidumperMutex_); std::lock_guard<std::mutex> lock(hidumperMutex_);
if (errorInfo_.size() + 1 > MAX_RECORED_ERROR) { if (errorInfo_.size() + 1 > MAX_RECORD_ERROR) {
errorInfo_.pop_front(); errorInfo_.pop_front();
errorInfo_.push_back(error); errorInfo_.push_back(error);
} else { } else {
@ -58,7 +58,7 @@ bool InputmethodDump::Dump(int fd, const std::vector<std::string> &args)
if (args.size() == CMD_ONE_PARAM) { if (args.size() == CMD_ONE_PARAM) {
command = args.at(SUB_CMD_NAME); command = args.at(SUB_CMD_NAME);
} else { } else {
ShowIllealInfomation(fd); ShowIllealInformation(fd);
} }
if (command == CMD_HELP) { if (command == CMD_HELP) {
ShowHelp(fd); ShowHelp(fd);
@ -68,7 +68,7 @@ bool InputmethodDump::Dump(int fd, const std::vector<std::string> &args)
} }
dumpAllMethod_(fd); dumpAllMethod_(fd);
} else { } else {
ShowIllealInfomation(fd); ShowIllealInformation(fd);
} }
IMSA_HILOGI("InputmethodDump::Dump command=%{public}s.", command.c_str()); IMSA_HILOGI("InputmethodDump::Dump command=%{public}s.", command.c_str());
return true; return true;
@ -84,7 +84,7 @@ void InputmethodDump::ShowHelp(int fd)
dprintf(fd, "%s\n", result.c_str()); dprintf(fd, "%s\n", result.c_str());
} }
void InputmethodDump::ShowIllealInfomation(int fd) void InputmethodDump::ShowIllealInformation(int fd)
{ {
dprintf(fd, "%s\n", ILLEGAL_INFO.c_str()); dprintf(fd, "%s\n", ILLEGAL_INFO.c_str());
} }

View File

@ -24,10 +24,10 @@ using HiSysEventNameSpace = OHOS::HiviewDFX::HiSysEvent;
const std::string DOMAIN_STR = std::string(HiSysEventNameSpace::Domain::INPUTMETHOD); const std::string DOMAIN_STR = std::string(HiSysEventNameSpace::Domain::INPUTMETHOD);
} // namespace } // namespace
void FaultReporter(int32_t userId, std::string bundname, int32_t errCode) void FaultReporter(int32_t userId, std::string bundleName, int32_t errCode)
{ {
int ret = HiSysEventNameSpace::Write(DOMAIN_STR, "SERVICE_INIT_FAILED", HiSysEventNameSpace::EventType::FAULT, int ret = HiSysEventNameSpace::Write(DOMAIN_STR, "SERVICE_INIT_FAILED", HiSysEventNameSpace::EventType::FAULT,
"USER_ID", userId, "COMPONENT_ID", bundname, "ERROR_CODE", errCode); "USER_ID", userId, "COMPONENT_ID", bundleName, "ERROR_CODE", errCode);
if (ret != 0) { if (ret != 0) {
IMSA_HILOGE("hisysevent FaultReporter failed! ret %{public}d,errCode %{public}d", ret, errCode); IMSA_HILOGE("hisysevent FaultReporter failed! ret %{public}d,errCode %{public}d", ret, errCode);
} }
@ -51,4 +51,4 @@ void BehaviourReporter(std::string ActiveName, const std::string &inputmethodNam
} }
} }
} // namespace MiscServices } // namespace MiscServices
} // namespace OHOS } // namespace OHOS

View File

@ -18,7 +18,7 @@ import inputMethod from '@ohos.inputmethod';
@Component @Component
struct Dialog { struct Dialog {
private arr: string[] = [] private arr: string[] = []
private properityMap: Map<string, inputMethod.InputMethodProperty> = new Map(); private propertyMap: Map<string, inputMethod.InputMethodProperty> = new Map();
@State private win: any = undefined @State private win: any = undefined
@State private context: any = undefined @State private context: any = undefined
private inputMethods: Array<inputMethod.InputMethodProperty> = null private inputMethods: Array<inputMethod.InputMethodProperty> = null
@ -33,7 +33,7 @@ struct Dialog {
for (let inputmethod of this.inputMethods) { for (let inputmethod of this.inputMethods) {
let name = inputmethod.packageName let name = inputmethod.packageName
this.arr.push(name) this.arr.push(name)
this.properityMap.set(name, inputmethod) this.propertyMap.set(name, inputmethod)
} }
} }
@ -67,8 +67,8 @@ struct Dialog {
.borderRadius(10) .borderRadius(10)
.backgroundColor($r("app.color.btn_default")) .backgroundColor($r("app.color.btn_default"))
.onClick(async () => { .onClick(async () => {
if (this.properityMap.has(item)) { if (this.propertyMap.has(item)) {
let prop = this.properityMap.get(item) let prop = this.propertyMap.get(item)
globalThis.chooseInputMethods(prop) globalThis.chooseInputMethods(prop)
} }
setTimeout(() => { setTimeout(() => {

View File

@ -101,65 +101,54 @@ enum {
ERROR_STATUS_UNEXPECTED_NULL = ERROR_STATUS_UNKNOWN_ERROR + 8, // unexpected null, ERROR_STATUS_UNEXPECTED_NULL = ERROR_STATUS_UNKNOWN_ERROR + 8, // unexpected null,
// binder exception error code from Status.h // binder exception error code from Status.h
ERROR_EX_ILLEGAL_ARGUMENT = -3, // illegal argument exception ERROR_EX_ILLEGAL_ARGUMENT = -3, // illegal argument exception
ERROR_EX_NULL_POINTER = -4, // null pointer exception ERROR_EX_NULL_POINTER = -4, // null pointer exception
ERROR_EX_ILLEGAL_STATE = -5, // illegal state exception ERROR_EX_ILLEGAL_STATE = -5, // illegal state exception
ERROR_EX_NETWORK_MAIN_THREAD = -6, // network main thread exception ERROR_EX_NETWORK_MAIN_THREAD = -6, // network main thread exception
ERROR_EX_UNSUPPORTED_OPERATION = -7, // unsupported operation exception ERROR_EX_UNSUPPORTED_OPERATION = -7, // unsupported operation exception
ERROR_EX_SERVICE_SPECIFIC = -8, // service specific exception ERROR_EX_SERVICE_SPECIFIC = -8, // service specific exception
ERROR_EX_PARCELABLE = -9, // parcelable exception ERROR_EX_PARCELABLE = -9, // parcelable exception
// no error // no error
NO_ERROR = 0, // no error NO_ERROR = 0, // no error
// system service error // system service error
ERROR_NULL_POINTER, // null pointer ERROR_NULL_POINTER = 1, // null pointer
ERROR_BAD_PARAMETERS, // bad parameters ERROR_BAD_PARAMETERS = 2, // bad parameters
ERROR_SERVICE_START_FAILED, // failed to start service ERROR_USER_NOT_STARTED = 3, // user is not started
ERROR_USER_NOT_STARTED, // user is not started ERROR_USER_ALREADY_STARTED = 4, // user has already started
ERROR_USER_ALREADY_STARTED, // user has already started ERROR_USER_NOT_UNLOCKED = 5, // user is not unlocked
ERROR_USER_NOT_UNLOCKED, // user is not unlocked ERROR_USER_ALREADY_UNLOCKED = 6, // user has already unlocked
ERROR_USER_ALREADY_UNLOCKED, // user has already unlocked ERROR_USER_NOT_LOCKED = 7, // user is not locked
ERROR_USER_NOT_LOCKED, // user is not locked
ERROR_IME_NOT_AVAILABLE, // input method engine is not available ERROR_IME_NOT_AVAILABLE = 8, // input method engine is not available
ERROR_SECURITY_IME_NOT_AVAILABLE, // security input method engine is not available ERROR_SECURITY_IME_NOT_AVAILABLE = 9, // security input method engine is not available
ERROR_TOKEN_CREATE_FAILED, // failed to create window token ERROR_TOKEN_CREATE_FAILED = 10, // failed to create window token
ERROR_TOKEN_DESTROY_FAILED, // failed to destroy window token ERROR_TOKEN_DESTROY_FAILED = 11, // failed to destroy window token
ERROR_IME_BIND_FAILED, // failed to bind IME service ERROR_IME_BIND_FAILED = 12, // failed to bind IME service
ERROR_IME_UNBIND_FAILED, // failed to unbind IME service ERROR_IME_UNBIND_FAILED = 13, // failed to unbind IME service
ERROR_IME_START_FAILED, // failed to start IME service ERROR_IME_START_FAILED = 14, // failed to start IME service
ERROR_IME_STOP_FAILED, // failed to stop IME service ERROR_KBD_SHOW_FAILED = 15, // failed to show keyboard
ERROR_KBD_SHOW_FAILED, // failed to show keyboard ERROR_KBD_HIDE_FAILED = 16, // failed to hide keyboard
ERROR_KBD_HIDE_FAILED, // failed to hide keyboard ERROR_IME_NOT_STARTED = 17, // input method service is not started
ERROR_IME_NOT_STARTED, // input method service is not started ERROR_KBD_IS_OCCUPIED = 18, // keyboard is showing by other client
ERROR_KBD_IS_OCCUPIED, // keyboard is showing by other client ERROR_KBD_IS_NOT_SHOWING = 19, // keyboard is not showing
ERROR_KBD_IS_NOT_SHOWING, // keyboard is not showing ERROR_NOT_IME_PACKAGE = 20, // not an IME package
ERROR_IME_ALREADY_STARTED, // input method service has already started ERROR_IME_PACKAGE_DUPLICATED = 21, // duplicated IME package
ERROR_NOT_IME_PACKAGE, // not an IME package ERROR_SETTING_SAME_VALUE = 22, // same setting value
ERROR_IME_PACKAGE_DUPLICATED, // duplicated IME package ERROR_ADD_CLIENT_FAILED = 23, // add client failed
ERROR_SETTING_SAME_VALUE, // same setting value ERROR_SWITCH_IME = 24,
ERROR_NO_NEXT_IME, // no next ime is available
ERROR_CLIENTWINDOW_NOT_FOCUSED, // the input client window is not focused
ERROR_CLIENT_NOT_WINDOW, // the input client is not from a valid window
ERROR_ADD_CLIENT_FAILED,
ERROR_IME_PROPERTY_MARSHALL, // failed to marshall the ime property
ERROR_GETTING_CURRENT_IME,
ERROR_LIST_IME,
ERROR_SWITCH_IME,
// error from ime // error from ime
ERROR_REMOTE_IME_DIED, // remote input method service died abnormally ERROR_REMOTE_IME_DIED = 25, // remote input method service died abnormally
ERROR_RESTART_IME_FAILED, // failed to restart input method service
ERROR_IME_NULL_POINTER, // null pointer
// error from client // error from client
ERROR_REMOTE_CLIENT_DIED, // remote client died abnormally ERROR_REMOTE_CLIENT_DIED = 26, // remote client died abnormally
ERROR_CLIENT_DUPLICATED, // duplicated client ERROR_CLIENT_NOT_FOUND = 27, // client is not found
ERROR_CLIENT_NOT_FOUND, // client is not found ERROR_CLIENT_NULL_POINTER = 28, // null pointer
ERROR_CLIENT_NULL_POINTER, // null pointer ERROR_SUBSCRIBE_KEYBOARD_EVENT = 29,
ERROR_SUBSCRIBE_KEYBOARD_EVENT, ERROR_CONTROLLER_INVOKING_FAILED = 30,
ERROR_CONTROLLER_INVOKING_FAILED, ERROR_PERSIST_CONFIG = 31,
ERROR_PERSIST_CONFIG, ERROR_PACKAGE_MANAGER = 32,
ERROR_PACKAGE_MANAGER, ERROR_SERVICE_START_FAILED = 33,
ERROR_ABILITY_ACTIVATING, ERROR_ABILITY_ACTIVATING = 34,
}; };
const char *ToString(int errorCode); const char *ToString(int errorCode);
}; // namespace ErrorCode }; // namespace ErrorCode

View File

@ -20,12 +20,12 @@
#include <mutex> #include <mutex>
#include <vector> #include <vector>
#include "../adapter/keyboard/keyboard_event.h"
#include "common_event_data.h" #include "common_event_data.h"
#include "common_event_manager.h" #include "common_event_manager.h"
#include "common_event_subscribe_info.h" #include "common_event_subscribe_info.h"
#include "common_event_subscriber.h" #include "common_event_subscriber.h"
#include "common_event_support.h" #include "common_event_support.h"
#include "keyboard_event.h"
#include "matching_skills.h" #include "matching_skills.h"
#include "system_ability_status_change_stub.h" #include "system_ability_status_change_stub.h"
@ -37,7 +37,7 @@ public:
~ImCommonEventManager(); ~ImCommonEventManager();
static sptr<ImCommonEventManager> GetInstance(); static sptr<ImCommonEventManager> GetInstance();
bool SubscribeEvent(const std::string &event); bool SubscribeEvent(const std::string &event);
bool SubscribeKeyboardEvent(const std::vector<KeyboardEventHandler> &handlers); bool SubscribeKeyboardEvent(KeyHandle handle);
bool UnsubscribeEvent(); bool UnsubscribeEvent();
class EventSubscriber : public EventFwk::CommonEventSubscriber { class EventSubscriber : public EventFwk::CommonEventSubscriber {
@ -47,6 +47,7 @@ public:
{ {
} }
void OnReceiveEvent(const EventFwk::CommonEventData &data); void OnReceiveEvent(const EventFwk::CommonEventData &data);
void HandlePackageRemove(const AAFwk::Want &want, const std::string action);
void startUser(int32_t newUserId); void startUser(int32_t newUserId);
}; };

View File

@ -20,7 +20,6 @@
#include <map> #include <map>
#include <thread> #include <thread>
#include "../adapter/keyboard/keyboard_event.h"
#include "ability_manager_interface.h" #include "ability_manager_interface.h"
#include "application_info.h" #include "application_info.h"
#include "bundle_mgr_proxy.h" #include "bundle_mgr_proxy.h"
@ -29,6 +28,7 @@
#include "input_method_system_ability_stub.h" #include "input_method_system_ability_stub.h"
#include "inputmethod_dump.h" #include "inputmethod_dump.h"
#include "inputmethod_trace.h" #include "inputmethod_trace.h"
#include "keyboard_event.h"
#include "peruser_session.h" #include "peruser_session.h"
#include "peruser_setting.h" #include "peruser_setting.h"
#include "system_ability.h" #include "system_ability.h"
@ -136,11 +136,11 @@ private:
static constexpr const char *SELECT_DIALOG_HAP = "cn.openharmony.inputmethodchoosedialog"; static constexpr const char *SELECT_DIALOG_HAP = "cn.openharmony.inputmethodchoosedialog";
static constexpr const char *SELECT_DIALOG_ABILITY = "InputMethod"; static constexpr const char *SELECT_DIALOG_ABILITY = "InputMethod";
int32_t SubscribeKeyboardEvent(); int32_t InitKeyEventMonitor();
using CompareHandler = std::function<bool(const SubProperty &)>; using CompareHandler = std::function<bool(const SubProperty &)>;
SubProperty FindSubPropertyByCompare(const std::string &bundleName, CompareHandler compare); SubProperty FindSubPropertyByCompare(const std::string &bundleName, CompareHandler compare);
SubProperty GetExtends(const std::vector<Metadata> &metaData); SubProperty GetExtends(const std::vector<Metadata> &metaData);
int32_t SwitchByCombinedKey(const CombineKeyCode &property); int32_t SwitchByCombinationKey(uint32_t state);
int32_t QueryImeInfos(int32_t userId, std::vector<AppExecFwk::ExtensionAbilityInfo> &infos); int32_t QueryImeInfos(int32_t userId, std::vector<AppExecFwk::ExtensionAbilityInfo> &infos);
}; };

View File

@ -89,6 +89,8 @@ enum {
// the request from IMC to IMA // the request from IMC to IMA
MSG_ID_ON_CURSOR_UPDATE, MSG_ID_ON_CURSOR_UPDATE,
MSG_ID_ON_SELECTION_CHANGE, MSG_ID_ON_SELECTION_CHANGE,
MSG_ID_QUIT_WORKER_THREAD,
}; };
} }

View File

@ -115,27 +115,24 @@ private:
int userId_; // the id of the user to whom the object is linking int userId_; // the id of the user to whom the object is linking
int userState = UserState::USER_STATE_STARTED; // the state of the user to whom the object is linking int userState = UserState::USER_STATE_STARTED; // the state of the user to whom the object is linking
int displayId; // the id of the display screen on which the user is int displayId; // the id of the display screen on which the user is
int currentIndex;
std::map<sptr<IRemoteObject>, std::shared_ptr<ClientInfo>> mapClients; std::map<sptr<IRemoteObject>, std::shared_ptr<ClientInfo>> mapClients;
static const int MIN_IME = 2; static const int MIN_IME = 2;
static const int MAX_RESTART_NUM = 3; static const int MAX_RESTART_NUM = 3;
static const int IME_RESET_TIME_OUT = 300; static const int IME_RESET_TIME_OUT = 300;
static const int MAX_RESET_WAIT_TIME = 1600000; static const int MAX_RESET_WAIT_TIME = 1600000;
static const int SLEEP_TIME = 300000;
InputMethodInfo *currentIme[MAX_IME] = { nullptr, nullptr }; // 0 - the default ime. 1 - security ime InputMethodInfo *currentIme[MAX_IME] = { nullptr, nullptr }; // 0 - the default ime. 1 - security ime
InputControlChannelStub *localControlChannel[MAX_IME]; InputControlChannelStub *localControlChannel[MAX_IME];
sptr<IInputControlChannel> inputControlChannel[MAX_IME]; sptr<IInputControlChannel> inputControlChannel[MAX_IME];
std::mutex imsCoreLock_;
sptr<IInputMethodCore> imsCore[MAX_IME]; // the remote handlers of input method service sptr<IInputMethodCore> imsCore[MAX_IME]; // the remote handlers of input method service
sptr<IRemoteObject> inputMethodToken[MAX_IME]; // the window token of keyboard sptr<IRemoteObject> inputMethodToken[MAX_IME]; // the window token of keyboard
int currentKbdIndex[MAX_IME]; // current keyboard index int currentKbdIndex[MAX_IME]; // current keyboard index
int lastImeIndex; // The last ime which showed keyboard int lastImeIndex = DEFAULT_IME; // The last ime which showed keyboard
InputMethodSetting *inputMethodSetting; // The pointer referred to the object in PerUserSetting InputMethodSetting *inputMethodSetting; // The pointer referred to the object in PerUserSetting
int currentDisplayMode; // the display mode of the current keyboard
sptr<IInputMethodAgent> imsAgent; sptr<IInputMethodAgent> imsAgent;
InputChannel *imsChannel; // the write channel created by input method service
std::mutex clientLock_; std::mutex clientLock_;
sptr<IInputClient> currentClient; // the current input client sptr<IInputClient> currentClient; // the current input client
sptr<IInputClient> needReshowClient = nullptr; // the input client for which keyboard need to re-show sptr<IInputClient> needReshowClient = nullptr; // the input client for which keyboard need to re-show
@ -144,7 +141,6 @@ private:
MessageHandler *msgHandler = nullptr; // message handler working with Work Thread MessageHandler *msgHandler = nullptr; // message handler working with Work Thread
std::thread workThreadHandler; // work thread handler std::thread workThreadHandler; // work thread handler
std::recursive_mutex mtx; // mutex to lock the operations among multi work threads std::recursive_mutex mtx; // mutex to lock the operations among multi work threads
sptr<AAFwk::AbilityConnectionProxy> connCallback;
std::mutex resetLock; std::mutex resetLock;
ResetManager manager[MAX_IME]; ResetManager manager[MAX_IME];
@ -172,7 +168,6 @@ private:
int StopInputMethod(int index); int StopInputMethod(int index);
int ShowKeyboard(const sptr<IInputClient> &inputClient, bool isShowKeyboard); int ShowKeyboard(const sptr<IInputClient> &inputClient, bool isShowKeyboard);
int HideKeyboard(const sptr<IInputClient> &inputClient); int HideKeyboard(const sptr<IInputClient> &inputClient);
void SetDisplayId(int displayId);
int GetImeIndex(const sptr<IInputClient> &inputClient); int GetImeIndex(const sptr<IInputClient> &inputClient);
static sptr<AAFwk::IAbilityManager> GetAbilityManagerService(); static sptr<AAFwk::IAbilityManager> GetAbilityManagerService();
void SendAgentToSingleClient(const ClientInfo &clientInfo); void SendAgentToSingleClient(const ClientInfo &clientInfo);
@ -183,6 +178,17 @@ private:
void ClearImeData(uint32_t index); void ClearImeData(uint32_t index);
void SetCurrentClient(sptr<IInputClient> client); void SetCurrentClient(sptr<IInputClient> client);
sptr<IInputClient> GetCurrentClient(); sptr<IInputClient> GetCurrentClient();
void SetImsCore(int32_t index, sptr<IInputMethodCore> core);
sptr<IInputMethodCore> GetImsCore(int32_t index);
int32_t SetClientState(bool isAlive);
static inline bool IsValid(int32_t index)
{
return index >= DEFAULT_IME && index <= SECURITY_IME;
}
inline bool IsIMEEqual()
{
return GetImsCore(DEFAULT_IME) == GetImsCore(SECURITY_IME);
}
std::mutex propertyLock_; std::mutex propertyLock_;
SubProperty currentSubProperty; SubProperty currentSubProperty;

View File

@ -82,8 +82,8 @@ const char *ToString(int errorCode)
case ERROR_IME_START_FAILED: { case ERROR_IME_START_FAILED: {
return "failed to start input"; return "failed to start input";
} }
case ERROR_IME_STOP_FAILED: { case ERROR_ADD_CLIENT_FAILED: {
return "failed to stop input"; return "failed fo add client";
} }
case ERROR_KBD_SHOW_FAILED: { case ERROR_KBD_SHOW_FAILED: {
return "failed to show keyboard"; return "failed to show keyboard";
@ -100,9 +100,6 @@ const char *ToString(int errorCode)
case ERROR_KBD_IS_NOT_SHOWING: { case ERROR_KBD_IS_NOT_SHOWING: {
return "keyboard is not showing"; return "keyboard is not showing";
} }
case ERROR_IME_ALREADY_STARTED: {
return "input method service has already started";
}
case ERROR_NOT_IME_PACKAGE: { case ERROR_NOT_IME_PACKAGE: {
return "not an input method engine package"; return "not an input method engine package";
} }
@ -112,27 +109,12 @@ const char *ToString(int errorCode)
case ERROR_SETTING_SAME_VALUE: { case ERROR_SETTING_SAME_VALUE: {
return "same setting value"; return "same setting value";
} }
case ERROR_NO_NEXT_IME: {
return "next input method engine is not available";
}
case ERROR_CLIENTWINDOW_NOT_FOCUSED: {
return "input client window is not focused";
}
case ERROR_CLIENT_NOT_WINDOW: {
return "input client is not from a valid window";
}
case ERROR_REMOTE_IME_DIED: { case ERROR_REMOTE_IME_DIED: {
return "input method service died"; return "input method service died";
} }
case ERROR_RESTART_IME_FAILED: {
return "failed to restart input method service";
}
case ERROR_REMOTE_CLIENT_DIED: { case ERROR_REMOTE_CLIENT_DIED: {
return "input client died"; return "input client died";
} }
case ERROR_CLIENT_DUPLICATED: {
return "duplicated client";
}
case ERROR_CLIENT_NOT_FOUND: { case ERROR_CLIENT_NOT_FOUND: {
return "client is not found"; return "client is not found";
} }

View File

@ -17,11 +17,11 @@
#include <utility> #include <utility>
#include "../adapter/keyboard/keyboard_event.h"
#include "global.h" #include "global.h"
#include "input_method_system_ability_stub.h" #include "input_method_system_ability_stub.h"
#include "ipc_skeleton.h" #include "ipc_skeleton.h"
#include "iservice_registry.h" #include "iservice_registry.h"
#include "itypes_util.h"
#include "message_handler.h" #include "message_handler.h"
#include "system_ability_definition.h" #include "system_ability_definition.h"
@ -33,15 +33,11 @@ std::mutex ImCommonEventManager::instanceLock_;
/*! Constructor /*! Constructor
*/ */
ImCommonEventManager::ImCommonEventManager() ImCommonEventManager::ImCommonEventManager() {}
{
}
/*! Destructor /*! Destructor
*/ */
ImCommonEventManager::~ImCommonEventManager() ImCommonEventManager::~ImCommonEventManager() {}
{
}
sptr<ImCommonEventManager> ImCommonEventManager::GetInstance() sptr<ImCommonEventManager> ImCommonEventManager::GetInstance()
{ {
@ -59,6 +55,7 @@ bool ImCommonEventManager::SubscribeEvent(const std::string &event)
{ {
EventFwk::MatchingSkills matchingSkills; EventFwk::MatchingSkills matchingSkills;
matchingSkills.AddEvent(event); matchingSkills.AddEvent(event);
matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED);
EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills); EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills);
@ -89,27 +86,25 @@ bool ImCommonEventManager::SubscribeEvent(const std::string &event)
return true; return true;
} }
bool ImCommonEventManager::SubscribeKeyboardEvent(const std::vector<KeyboardEventHandler> &handlers) bool ImCommonEventManager::SubscribeKeyboardEvent(KeyHandle handle)
{ {
IMSA_HILOGI("ImCommonEventManager::SubscribeKeyboardEvent");
auto abilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); auto abilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
if (abilityManager == nullptr) { if (abilityManager == nullptr) {
IMSA_HILOGE("SubscribeEvent abilityManager is nullptr"); IMSA_HILOGE("SubscribeKeyboardEvent abilityManager is nullptr");
return false; return false;
} }
sptr<ISystemAbilityStatusChange> listener = new (std::nothrow) SystemAbilityStatusChangeListener([handlers]() { sptr<ISystemAbilityStatusChange> listener = new (std::nothrow) SystemAbilityStatusChangeListener([&handle]() {
for (const auto &handler : handlers) { int32_t ret = KeyboardEvent::GetInstance().AddKeyEventMonitor(handle);
int32_t ret = KeyboardEvent::GetInstance().SubscribeKeyboardEvent(handler.combine, handler.handle); IMSA_HILOGI("SubscribeKeyboardEvent add monitor %{public}s", ret == ErrorCode::NO_ERROR ? "success" : "failed");
IMSA_HILOGI("subscribe %{public}d key event %{public}s", handler.combine.finalKey,
ret == ErrorCode::NO_ERROR ? "OK" : "ERROR");
}
}); });
if (listener == nullptr) { if (listener == nullptr) {
IMSA_HILOGE("SubscribeEvent listener is nullptr"); IMSA_HILOGE("SubscribeKeyboardEvent listener is nullptr");
return false; return false;
} }
int32_t ret = abilityManager->SubscribeSystemAbility(MULTIMODAL_INPUT_SERVICE_ID, listener); int32_t ret = abilityManager->SubscribeSystemAbility(MULTIMODAL_INPUT_SERVICE_ID, listener);
if (ret != ERR_OK) { if (ret != ERR_OK) {
IMSA_HILOGE("SubscribeEvent SubscribeSystemAbility failed. ret = %{public}d", ret); IMSA_HILOGE("SubscribeKeyboardEvent SubscribeSystemAbility failed. ret = %{public}d", ret);
return false; return false;
} }
keyboardEventListener_ = listener; keyboardEventListener_ = listener;
@ -129,6 +124,9 @@ void ImCommonEventManager::EventSubscriber::OnReceiveEvent(const EventFwk::Commo
if (action == EventFwk::CommonEventSupport::COMMON_EVENT_USER_SWITCHED) { if (action == EventFwk::CommonEventSupport::COMMON_EVENT_USER_SWITCHED) {
IMSA_HILOGI("ImCommonEventManager::OnReceiveEvent user switched!!!"); IMSA_HILOGI("ImCommonEventManager::OnReceiveEvent user switched!!!");
startUser(data.GetCode()); startUser(data.GetCode());
} else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED) {
IMSA_HILOGI("ImCommonEventManager::OnReceiveEvent package removed!!!");
HandlePackageRemove(want, action);
} }
} }
@ -145,6 +143,21 @@ void ImCommonEventManager::EventSubscriber::startUser(int newUserId)
IMSA_HILOGI("ImCommonEventManager::startUser 3"); IMSA_HILOGI("ImCommonEventManager::startUser 3");
} }
void ImCommonEventManager::EventSubscriber::HandlePackageRemove(const AAFwk::Want &want, const std::string action)
{
auto element = want.GetElement();
std::string bundleName = element.GetBundleName();
int32_t userId = want.GetIntParam("userId", 0);
IMSA_HILOGD("bundleName = %{public}s, userId = %{public}d", bundleName.c_str(), userId);
MessageParcel *parcel = new MessageParcel();
if (!ITypesUtil::Marshal(*parcel, userId, bundleName)) {
IMSA_HILOGE("Failed to write message parcel");
return;
}
Message *msg = new Message(MessageID::MSG_ID_PACKAGE_REMOVED, parcel);
MessageHandler::Instance()->SendMessage(msg);
}
ImCommonEventManager::SystemAbilityStatusChangeListener::SystemAbilityStatusChangeListener(std::function<void()> func) ImCommonEventManager::SystemAbilityStatusChangeListener::SystemAbilityStatusChangeListener(std::function<void()> func)
: func_(std::move(func)) : func_(std::move(func))
{ {

View File

@ -17,9 +17,7 @@
#include <global.h> #include <global.h>
#include <utils.h> #include <utils.h>
#include <key_event.h>
#include "../adapter/keyboard/keyboard_event.h"
#include "ability_connect_callback_proxy.h" #include "ability_connect_callback_proxy.h"
#include "ability_manager_errors.h" #include "ability_manager_errors.h"
#include "ability_manager_interface.h" #include "ability_manager_interface.h"
@ -32,11 +30,12 @@
#include "input_method_status.h" #include "input_method_status.h"
#include "ipc_skeleton.h" #include "ipc_skeleton.h"
#include "iservice_registry.h" #include "iservice_registry.h"
#include "itypes_util.h"
#include "key_event.h"
#include "message_handler.h" #include "message_handler.h"
#include "os_account_manager.h" #include "os_account_manager.h"
#include "para_handle.h" #include "para_handle.h"
#include "resource_manager.h" #include "resource_manager.h"
#include "sa_mgr_client.h"
#include "system_ability.h" #include "system_ability.h"
#include "system_ability_definition.h" #include "system_ability_definition.h"
#include "ui_service_mgr_client.h" #include "ui_service_mgr_client.h"
@ -185,8 +184,8 @@ namespace MiscServices {
std::string defaultIme = ParaHandle::GetDefaultIme(userId_); std::string defaultIme = ParaHandle::GetDefaultIme(userId_);
StartInputService(defaultIme); StartInputService(defaultIme);
StartUserIdListener(); StartUserIdListener();
int32_t ret = SubscribeKeyboardEvent(); int32_t ret = InitKeyEventMonitor();
IMSA_HILOGI("subscribe key event ret %{public}d", ret); IMSA_HILOGI("init KeyEvent monitor %{public}s", ret == ErrorCode::NO_ERROR ? "success" : "failed");
return ErrorCode::NO_ERROR; return ErrorCode::NO_ERROR;
} }
@ -554,7 +553,8 @@ namespace MiscServices {
int32_t InputMethodSystemAbility::SwitchInputMethod(const std::string &name, const std::string &subName) int32_t InputMethodSystemAbility::SwitchInputMethod(const std::string &name, const std::string &subName)
{ {
IMSA_HILOGI("InputMethodSystemAbility::SwitchInputMethod"); IMSA_HILOGD("InputMethodSystemAbility name: %{public}s, subName: %{public}s", name.c_str(),
subName.c_str());
return subName.empty() ? SwitchInputMethodType(name) : SwitchInputMethodSubtype(name, subName); return subName.empty() ? SwitchInputMethodType(name) : SwitchInputMethodSubtype(name, subName);
} }
@ -740,6 +740,7 @@ namespace MiscServices {
property.descriptionId = applicationInfo.descriptionId; property.descriptionId = applicationInfo.descriptionId;
property.label = Str8ToStr16(labelString); property.label = Str8ToStr16(labelString);
property.description = Str8ToStr16(descriptionString); property.description = Str8ToStr16(descriptionString);
properties.emplace_back(property);
} }
return properties; return properties;
} }
@ -879,6 +880,8 @@ namespace MiscServices {
} }
case MSG_ID_PACKAGE_REMOVED: { case MSG_ID_PACKAGE_REMOVED: {
OnPackageRemoved(msg); OnPackageRemoved(msg);
delete msg;
msg = nullptr;
break; break;
} }
case MSG_ID_SETTING_CHANGED: { case MSG_ID_SETTING_CHANGED: {
@ -1175,39 +1178,29 @@ namespace MiscServices {
{ {
IMSA_HILOGI("Start...\n"); IMSA_HILOGI("Start...\n");
MessageParcel *data = msg->msgContent_; MessageParcel *data = msg->msgContent_;
if (!data) { if (data == nullptr) {
IMSA_HILOGI("InputMethodSystemAbility::OnPackageRemoved data is nullptr"); IMSA_HILOGI("InputMethodSystemAbility::OnPackageRemoved data is nullptr");
return ErrorCode::ERROR_NULL_POINTER; return ErrorCode::ERROR_NULL_POINTER;
} }
int32_t userId = data->ReadInt32(); int32_t userId = 0;
int32_t size = data->ReadInt32(); std::string packageName = "";
if (!ITypesUtil::Unmarshal(*data, userId, packageName)) {
if (size <= 0) { IMSA_HILOGE("Failed to read message parcel");
IMSA_HILOGE("Aborted! %s\n", ErrorCode::ToString(ErrorCode::ERROR_BAD_PARAMETERS)); return ErrorCode::ERROR_EX_PARCELABLE;
return ErrorCode::ERROR_BAD_PARAMETERS;
} }
std::u16string packageName = data->ReadString16();
PerUserSetting *setting = GetUserSetting(userId); PerUserSetting *setting = GetUserSetting(userId);
if (!setting || setting->GetUserState() != UserState::USER_STATE_UNLOCKED) { if (setting == nullptr || setting->GetUserState() != UserState::USER_STATE_UNLOCKED) {
IMSA_HILOGE("Aborted! %s %d\n", ErrorCode::ToString(ErrorCode::ERROR_USER_NOT_UNLOCKED), userId); IMSA_HILOGE("Aborted! %s %d\n", ErrorCode::ToString(ErrorCode::ERROR_USER_NOT_UNLOCKED), userId);
return ErrorCode::ERROR_USER_NOT_UNLOCKED; return ErrorCode::ERROR_USER_NOT_UNLOCKED;
} }
auto session = GetUserSession(userId);
if (session == nullptr) { std::string defaultIme = ParaHandle::GetDefaultIme(userId);
IMSA_HILOGI("InputMethodSystemAbility::OnPackageRemoved session is nullptr"); std::string::size_type pos = defaultIme.find("/");
return ErrorCode::ERROR_NULL_POINTER; std::string currentIme = defaultIme.substr(0, pos);
} if (packageName == currentIme) {
session->OnPackageRemoved(packageName); int32_t ret = OnSwitchInputMethod(ParaHandle::DEFAULT_PACKAGE_NAME, ParaHandle::DEFAULT_ABILITY_NAME);
bool securityImeFlag = false; IMSA_HILOGI("InputMethodSystemAbility::OnPackageRemoved ret = %{public}d", ret);
int32_t ret = setting->OnPackageRemoved(packageName, securityImeFlag);
if (ret != ErrorCode::NO_ERROR) {
IMSA_HILOGI("End...\n");
return ret;
}
if (securityImeFlag) {
InputMethodInfo *securityIme = setting->GetSecurityInputMethod();
InputMethodInfo *defaultIme = setting->GetCurrentInputMethod();
session->ResetIme(defaultIme, securityIme);
} }
return 0; return 0;
} }
@ -1377,13 +1370,19 @@ namespace MiscServices {
sptr<AAFwk::IAbilityManager> InputMethodSystemAbility::GetAbilityManagerService() sptr<AAFwk::IAbilityManager> InputMethodSystemAbility::GetAbilityManagerService()
{ {
IMSA_HILOGE("InputMethodSystemAbility::GetAbilityManagerService start"); IMSA_HILOGD("InputMethodSystemAbility::GetAbilityManagerService start");
sptr<IRemoteObject> abilityMsObj = auto systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
OHOS::DelayedSingleton<AAFwk::SaMgrClient>::GetInstance()->GetSystemAbility(ABILITY_MGR_SERVICE_ID); if (systemAbilityManager == nullptr) {
if (!abilityMsObj) { IMSA_HILOGE("SystemAbilityManager is nullptr.");
IMSA_HILOGE("failed to get ability manager service");
return nullptr; return nullptr;
} }
auto abilityMsObj = systemAbilityManager->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
if (abilityMsObj == nullptr) {
IMSA_HILOGE("Failed to get ability manager service.");
return nullptr;
}
return iface_cast<AAFwk::IAbilityManager>(abilityMsObj); return iface_cast<AAFwk::IAbilityManager>(abilityMsObj);
} }
@ -1406,16 +1405,16 @@ namespace MiscServices {
return {}; return {};
} }
int32_t InputMethodSystemAbility::SwitchByCombinedKey(const CombineKeyCode &keyCode) int32_t InputMethodSystemAbility::SwitchByCombinationKey(uint32_t state)
{ {
IMSA_HILOGI("InputMethodSystemAbility::SwitchByCombinedKey"); IMSA_HILOGI("InputMethodSystemAbility::SwitchByCombinationKey");
auto current = GetCurrentInputMethodSubtype(); auto current = GetCurrentInputMethodSubtype();
if (current == nullptr) { if (current == nullptr) {
IMSA_HILOGE("GetCurrentInputMethodSubtype failed"); IMSA_HILOGE("GetCurrentInputMethodSubtype failed");
return ErrorCode::ERROR_EX_NULL_POINTER; return ErrorCode::ERROR_EX_NULL_POINTER;
} }
if (keyCode == CombineKeyCode::COMBINE_KEYCODE_CAPS) { if (KeyboardEvent::IS_KEYS_DOWN(state, KeyboardEvent::CAPS_MASK)) {
IMSA_HILOGI("COMBINE_KEYCODE_CAPS press"); IMSA_HILOGI("CAPS press");
auto target = current->mode == "upper" auto target = current->mode == "upper"
? FindSubPropertyByCompare(current->id, ? FindSubPropertyByCompare(current->id,
[&current](const SubProperty &property) { return property.mode == "lower"; }) [&current](const SubProperty &property) { return property.mode == "lower"; })
@ -1423,8 +1422,9 @@ namespace MiscServices {
[&current](const SubProperty &property) { return property.mode == "upper"; }); [&current](const SubProperty &property) { return property.mode == "upper"; });
return SwitchInputMethod(target.id, target.label); return SwitchInputMethod(target.id, target.label);
} }
if (keyCode == CombineKeyCode::COMBINE_KEYCODE_SHIFT) { if (KeyboardEvent::IS_KEYS_DOWN(state, KeyboardEvent::SHIFT_LEFT_MASK)
IMSA_HILOGI("COMBINE_KEYCODE_SHIFT press"); || KeyboardEvent::IS_KEYS_DOWN(state, KeyboardEvent::SHIFT_RIGHT_MASK)) {
IMSA_HILOGI("SHIFT press");
auto target = current->language == "chinese" auto target = current->language == "chinese"
? FindSubPropertyByCompare(current->id, ? FindSubPropertyByCompare(current->id,
[&current](const SubProperty &property) { return property.language == "english"; }) [&current](const SubProperty &property) { return property.language == "english"; })
@ -1432,8 +1432,11 @@ namespace MiscServices {
[&current](const SubProperty &property) { return property.language == "chinese"; }); [&current](const SubProperty &property) { return property.language == "chinese"; });
return SwitchInputMethod(target.id, target.label); return SwitchInputMethod(target.id, target.label);
} }
if (keyCode == CombineKeyCode::COMBINE_KEYCODE_CTRL_SHIFT) { if (KeyboardEvent::IS_KEYS_DOWN(state, KeyboardEvent::CTRL_LEFT_MASK | KeyboardEvent::SHIFT_LEFT_MASK)
IMSA_HILOGI("COMBINE_KEYCODE_CTRL_SHIFT press"); || KeyboardEvent::IS_KEYS_DOWN(state, KeyboardEvent::CTRL_LEFT_MASK | KeyboardEvent::SHIFT_RIGHT_MASK)
|| KeyboardEvent::IS_KEYS_DOWN(state, KeyboardEvent::CTRL_RIGHT_MASK | KeyboardEvent::SHIFT_LEFT_MASK)
|| KeyboardEvent::IS_KEYS_DOWN(state, KeyboardEvent::CTRL_RIGHT_MASK | KeyboardEvent::SHIFT_RIGHT_MASK)) {
IMSA_HILOGI("CTRL_SHIFT press");
std::vector<Property> props = {}; std::vector<Property> props = {};
auto ret = ListProperty(MAIN_USER_ID, props); auto ret = ListProperty(MAIN_USER_ID, props);
if (ret != ErrorCode::NO_ERROR) { if (ret != ErrorCode::NO_ERROR) {
@ -1442,53 +1445,20 @@ namespace MiscServices {
} }
for (const auto &prop : props) { for (const auto &prop : props) {
if (prop.name != current->id) { if (prop.name != current->id) {
return SwitchInputMethod(current->name, current->id); return SwitchInputMethod(prop.name, prop.id);
} }
} }
} }
IMSA_HILOGI("keycode undefined"); IMSA_HILOGD("keycode undefined");
return ErrorCode::ERROR_EX_UNSUPPORTED_OPERATION; return ErrorCode::ERROR_EX_UNSUPPORTED_OPERATION;
} }
int32_t InputMethodSystemAbility::SubscribeKeyboardEvent() int32_t InputMethodSystemAbility::InitKeyEventMonitor()
{ {
ImCommonEventManager::GetInstance()->SubscribeKeyboardEvent( IMSA_HILOGI("InputMethodSystemAbility::InitKeyEventMonitor");
{ { { bool ret = ImCommonEventManager::GetInstance()->SubscribeKeyboardEvent(
.preKeys = {}, [this](uint32_t keyCode) { return SwitchByCombinationKey(keyCode); });
.finalKey = MMI::KeyEvent::KEYCODE_CAPS_LOCK, return ret ? ErrorCode::NO_ERROR : ErrorCode::ERROR_SERVICE_START_FAILED;
},
[this]() { SwitchByCombinedKey(CombineKeyCode::COMBINE_KEYCODE_CAPS); } },
{ {
.preKeys = {},
.finalKey = MMI::KeyEvent::KEYCODE_SHIFT_LEFT,
},
[this]() { SwitchByCombinedKey(CombineKeyCode::COMBINE_KEYCODE_SHIFT); } },
{ {
.preKeys = {},
.finalKey = MMI::KeyEvent::KEYCODE_SHIFT_RIGHT,
},
[this]() { SwitchByCombinedKey(CombineKeyCode::COMBINE_KEYCODE_SHIFT); } },
{ {
.preKeys = { MMI::KeyEvent::KEYCODE_CTRL_LEFT },
.finalKey = MMI::KeyEvent::KEYCODE_SHIFT_LEFT,
},
[this]() { SwitchByCombinedKey(CombineKeyCode::COMBINE_KEYCODE_CTRL_SHIFT); } },
{ {
.preKeys = { MMI::KeyEvent::KEYCODE_CTRL_LEFT },
.finalKey = MMI::KeyEvent::KEYCODE_SHIFT_RIGHT,
},
[this]() { SwitchByCombinedKey(CombineKeyCode::COMBINE_KEYCODE_CTRL_SHIFT); } },
{ {
.preKeys = { MMI::KeyEvent::KEYCODE_CTRL_RIGHT },
.finalKey = MMI::KeyEvent::KEYCODE_SHIFT_LEFT,
},
[this]() { SwitchByCombinedKey(CombineKeyCode::COMBINE_KEYCODE_CTRL_SHIFT); } },
{ {
.preKeys = { MMI::KeyEvent::KEYCODE_CTRL_RIGHT },
.finalKey = MMI::KeyEvent::KEYCODE_SHIFT_RIGHT,
},
[this]() { SwitchByCombinedKey(CombineKeyCode::COMBINE_KEYCODE_CTRL_SHIFT); } } });
return 0;
} }
} // namespace MiscServices } // namespace MiscServices
} // namespace OHOS } // namespace OHOS

View File

@ -31,7 +31,7 @@
#include "para_handle.h" #include "para_handle.h"
#include "parcel.h" #include "parcel.h"
#include "platform.h" #include "platform.h"
#include "sa_mgr_client.h" #include "iservice_registry.h"
#include "system_ability_definition.h" #include "system_ability_definition.h"
#include "unistd.h" #include "unistd.h"
#include "utils.h" #include "utils.h"
@ -137,14 +137,6 @@ namespace MiscServices {
} }
} }
/*! Set display Id
\param displayId the Id of display screen on which the input method keyboard show.
*/
void PerUserSession::SetDisplayId(int displayId)
{
this->displayId = displayId;
}
/*! Set the current input method engine /*! Set the current input method engine
\param ime the current (default) IME pointer referred to the instance in PerUserSetting. \param ime the current (default) IME pointer referred to the instance in PerUserSetting.
*/ */
@ -178,14 +170,15 @@ namespace MiscServices {
*/ */
void PerUserSession::ResetIme(InputMethodInfo *defaultIme, InputMethodInfo *securityIme) void PerUserSession::ResetIme(InputMethodInfo *defaultIme, InputMethodInfo *securityIme)
{ {
IMSA_HILOGI("PerUserSession::ResetIme"); IMSA_HILOGD("PerUserSession::ResetIme");
std::lock_guard<std::recursive_mutex> lock(mtx); std::lock_guard<std::recursive_mutex> lock(mtx);
InputMethodInfo *ime[] = {defaultIme, securityIme}; InputMethodInfo *ime[] = {defaultIme, securityIme};
for (int i = 0; i < MIN_IME; i++) { for (int i = 0; i < MIN_IME; i++) {
if (currentIme[i] == ime[i] && ime[i]) { if (currentIme[i] == ime[i] && ime[i]) {
continue; continue;
} }
if (imsCore[i]) { sptr<IInputMethodCore> core = GetImsCore(i);
if (core != nullptr) {
StopInputMethod(i); StopInputMethod(i);
} }
ResetImeError(i); ResetImeError(i);
@ -224,7 +217,7 @@ namespace MiscServices {
*/ */
void PerUserSession::OnPackageRemoved(const std::u16string& packageName) void PerUserSession::OnPackageRemoved(const std::u16string& packageName)
{ {
IMSA_HILOGI("PerUserSession::OnPackageRemoved"); IMSA_HILOGD("PerUserSession::OnPackageRemoved");
InputMethodSetting tmpSetting; InputMethodSetting tmpSetting;
bool flag = false; bool flag = false;
std::lock_guard<std::recursive_mutex> lock(mtx); std::lock_guard<std::recursive_mutex> lock(mtx);
@ -255,7 +248,7 @@ namespace MiscServices {
int PerUserSession::AddClient(sptr<IRemoteObject> inputClient, const ClientInfo &clientInfo) int PerUserSession::AddClient(sptr<IRemoteObject> inputClient, const ClientInfo &clientInfo)
{ {
IMSA_HILOGI("PerUserSession::AddClient"); IMSA_HILOGD("PerUserSession::AddClient");
std::lock_guard<std::recursive_mutex> lock(mtx); std::lock_guard<std::recursive_mutex> lock(mtx);
auto cacheClient = GetClientInfo(inputClient); auto cacheClient = GetClientInfo(inputClient);
if (cacheClient != nullptr) { if (cacheClient != nullptr) {
@ -287,7 +280,7 @@ namespace MiscServices {
*/ */
void PerUserSession::RemoveClient(sptr<IRemoteObject> inputClient) void PerUserSession::RemoveClient(sptr<IRemoteObject> inputClient)
{ {
IMSA_HILOGE("PerUserSession::RemoveClient"); IMSA_HILOGD("PerUserSession::RemoveClient");
std::lock_guard<std::recursive_mutex> lock(mtx); std::lock_guard<std::recursive_mutex> lock(mtx);
auto it = mapClients.find(inputClient); auto it = mapClients.find(inputClient);
if (it == mapClients.end()) { if (it == mapClients.end()) {
@ -311,17 +304,17 @@ namespace MiscServices {
int PerUserSession::StartInputMethod(int index) int PerUserSession::StartInputMethod(int index)
{ {
IMSA_HILOGI("PerUserSession::StartInputMethod index = %{public}d [%{public}d]\n", index, userId_); IMSA_HILOGI("PerUserSession::StartInputMethod index = %{public}d [%{public}d]\n", index, userId_);
sptr<IInputMethodCore> core = GetImsCore(index);
if (!imsCore[index]) { if (core == nullptr) {
IMSA_HILOGI("PerUserSession::StartInputMethod imscore is null"); IMSA_HILOGI("PerUserSession::StartInputMethod imscore is null");
return ErrorCode::ERROR_IME_BIND_FAILED; return ErrorCode::ERROR_IME_BIND_FAILED;
} }
sptr<IRemoteObject> b = imsCore[index]->AsObject(); sptr<IRemoteObject> b = core->AsObject();
inputMethodToken[index] = IPCSkeleton::GetInstance().GetContextObject(); inputMethodToken[index] = IPCSkeleton::GetInstance().GetContextObject();
localControlChannel[index] = new InputControlChannelStub(userId_); localControlChannel[index] = new InputControlChannelStub(userId_);
inputControlChannel[index] = localControlChannel[index]; inputControlChannel[index] = localControlChannel[index];
int ret_init = imsCore[index]->initializeInput(inputMethodToken[index], displayId, inputControlChannel[index]); int ret_init = core->initializeInput(inputMethodToken[index], displayId, inputControlChannel[index]);
if (ret_init != ErrorCode::NO_ERROR) { if (ret_init != ErrorCode::NO_ERROR) {
IMSA_HILOGE("PerUserSession::StartInputMethod initializeInput fail %{public}s", ErrorCode::ToString(ret_init)); IMSA_HILOGE("PerUserSession::StartInputMethod initializeInput fail %{public}s", ErrorCode::ToString(ret_init));
localControlChannel[index] = nullptr; localControlChannel[index] = nullptr;
@ -346,12 +339,13 @@ namespace MiscServices {
IMSA_HILOGE("Aborted! %{public}s", ErrorCode::ToString(ErrorCode::ERROR_BAD_PARAMETERS)); IMSA_HILOGE("Aborted! %{public}s", ErrorCode::ToString(ErrorCode::ERROR_BAD_PARAMETERS));
return ErrorCode::ERROR_BAD_PARAMETERS; return ErrorCode::ERROR_BAD_PARAMETERS;
} }
if (!imsCore[index] || !currentIme[index]) { sptr<IInputMethodCore> core = GetImsCore(index);
if (core == nullptr || currentIme[index] == nullptr) {
IMSA_HILOGE("Aborted! %{public}s", ErrorCode::ToString(ErrorCode::ERROR_IME_NOT_STARTED)); IMSA_HILOGE("Aborted! %{public}s", ErrorCode::ToString(ErrorCode::ERROR_IME_NOT_STARTED));
return ErrorCode::ERROR_IME_NOT_STARTED; return ErrorCode::ERROR_IME_NOT_STARTED;
} }
if (currentIme[index] == currentIme[1 - index] && imsCore[1 - index]) { if (currentIme[index] == currentIme[1 - index] && GetImsCore((1 - index)) != nullptr) {
imsCore[index] = nullptr; SetImsCore(index, nullptr);
inputControlChannel[index] = nullptr; inputControlChannel[index] = nullptr;
localControlChannel[index] = nullptr; localControlChannel[index] = nullptr;
IMSA_HILOGI("End...[%{public}d]\n", userId_); IMSA_HILOGI("End...[%{public}d]\n", userId_);
@ -368,12 +362,12 @@ namespace MiscServices {
IMSA_HILOGE("destroyWindowTaskId return : %{public}s [%{public}d]\n", ErrorCode::ToString(ret), userId_); IMSA_HILOGE("destroyWindowTaskId return : %{public}s [%{public}d]\n", ErrorCode::ToString(ret), userId_);
errorCode = ErrorCode::ERROR_TOKEN_DESTROY_FAILED; errorCode = ErrorCode::ERROR_TOKEN_DESTROY_FAILED;
} }
sptr<IRemoteObject> b = imsCore[index]->AsObject(); sptr<IRemoteObject> b = core->AsObject();
ret = b->RemoveDeathRecipient(imsDeathRecipient); ret = b->RemoveDeathRecipient(imsDeathRecipient);
if (ret != ErrorCode::NO_ERROR) { if (ret != ErrorCode::NO_ERROR) {
IMSA_HILOGE("RemoveDeathRecipient return : %{public}s [%{public}d]\n", ErrorCode::ToString(ret), userId_); IMSA_HILOGE("RemoveDeathRecipient return : %{public}s [%{public}d]\n", ErrorCode::ToString(ret), userId_);
} }
imsCore[index] = nullptr; SetImsCore(index, nullptr);
inputControlChannel[index] = nullptr; inputControlChannel[index] = nullptr;
localControlChannel[index] = nullptr; localControlChannel[index] = nullptr;
IMSA_HILOGI("End...[%{public}d]\n", userId_); IMSA_HILOGI("End...[%{public}d]\n", userId_);
@ -392,21 +386,21 @@ namespace MiscServices {
*/ */
int PerUserSession::ShowKeyboard(const sptr<IInputClient>& inputClient, bool isShowKeyboard) int PerUserSession::ShowKeyboard(const sptr<IInputClient>& inputClient, bool isShowKeyboard)
{ {
IMSA_HILOGI("PerUserSession::ShowKeyboard"); IMSA_HILOGD("PerUserSession::ShowKeyboard");
auto clientInfo = GetClientInfo(inputClient->AsObject()); auto clientInfo = GetClientInfo(inputClient->AsObject());
int index = GetImeIndex(inputClient); int index = GetImeIndex(inputClient);
if (index == -1 || clientInfo == nullptr) { if (index == -1 || clientInfo == nullptr) {
IMSA_HILOGE("PerUserSession::ShowKeyboard Aborted! index = -1 or clientInfo is nullptr"); IMSA_HILOGE("PerUserSession::ShowKeyboard Aborted! index = -1 or clientInfo is nullptr");
return ErrorCode::ERROR_CLIENT_NOT_FOUND; return ErrorCode::ERROR_CLIENT_NOT_FOUND;
} }
sptr<IInputMethodCore> core = GetImsCore(DEFAULT_IME);
if (imsCore[0] == nullptr) { if (core == nullptr) {
IMSA_HILOGE("PerUserSession::ShowKeyboard Aborted! imsCore[%{public}d] is nullptr", index); IMSA_HILOGE("PerUserSession::ShowKeyboard Aborted! imsCore[%{public}d] is nullptr", index);
return ErrorCode::ERROR_NULL_POINTER; return ErrorCode::ERROR_NULL_POINTER;
} }
auto subProperty = GetCurrentSubProperty(); auto subProperty = GetCurrentSubProperty();
int32_t ret = imsCore[0]->showKeyboard(clientInfo->channel, isShowKeyboard, subProperty); int32_t ret = core->showKeyboard(clientInfo->channel, isShowKeyboard, subProperty);
if (ret != ErrorCode::NO_ERROR) { if (ret != ErrorCode::NO_ERROR) {
IMSA_HILOGE("PerUserSession::showKeyboard failed ret: %{public}d", ret); IMSA_HILOGE("PerUserSession::showKeyboard failed ret: %{public}d", ret);
return ErrorCode::ERROR_KBD_SHOW_FAILED; return ErrorCode::ERROR_KBD_SHOW_FAILED;
@ -427,7 +421,7 @@ namespace MiscServices {
*/ */
int PerUserSession::HideKeyboard(const sptr<IInputClient>& inputClient) int PerUserSession::HideKeyboard(const sptr<IInputClient>& inputClient)
{ {
IMSA_HILOGI("PerUserSession::HideKeyboard"); IMSA_HILOGD("PerUserSession::HideKeyboard");
int index = GetImeIndex(inputClient); int index = GetImeIndex(inputClient);
if (index == -1) { if (index == -1) {
IMSA_HILOGE("PerUserSession::HideKeyboard Aborted! ErrorCode::ERROR_CLIENT_NOT_FOUND"); IMSA_HILOGE("PerUserSession::HideKeyboard Aborted! ErrorCode::ERROR_CLIENT_NOT_FOUND");
@ -437,12 +431,13 @@ namespace MiscServices {
if (clientInfo == nullptr) { if (clientInfo == nullptr) {
IMSA_HILOGE("PerUserSession::HideKeyboard GetClientInfo pointer nullptr"); IMSA_HILOGE("PerUserSession::HideKeyboard GetClientInfo pointer nullptr");
} }
if (imsCore[0] == nullptr) { sptr<IInputMethodCore> core = GetImsCore(DEFAULT_IME);
if (core == nullptr) {
IMSA_HILOGE("PerUserSession::HideKeyboard imsCore[index] is nullptr"); IMSA_HILOGE("PerUserSession::HideKeyboard imsCore[index] is nullptr");
return ErrorCode::ERROR_IME_NOT_STARTED; return ErrorCode::ERROR_IME_NOT_STARTED;
} }
bool ret = imsCore[0]->hideKeyboard(1); bool ret = core->hideKeyboard(1);
if (!ret) { if (!ret) {
IMSA_HILOGE("PerUserSession::HideKeyboard [imsCore->hideKeyboard] failed"); IMSA_HILOGE("PerUserSession::HideKeyboard [imsCore->hideKeyboard] failed");
return ErrorCode::ERROR_KBD_HIDE_FAILED; return ErrorCode::ERROR_KBD_HIDE_FAILED;
@ -457,15 +452,16 @@ namespace MiscServices {
*/ */
int PerUserSession::OnGetKeyboardWindowHeight(int &retHeight) int PerUserSession::OnGetKeyboardWindowHeight(int &retHeight)
{ {
if (imsCore[lastImeIndex]) { sptr<IInputMethodCore> core = GetImsCore(lastImeIndex);
int ret = imsCore[lastImeIndex]->getKeyboardWindowHeight(retHeight); if (core == nullptr) {
if (ret != ErrorCode::NO_ERROR) { IMSA_HILOGE("imsCore[0] is nullptr");
IMSA_HILOGE("getKeyboardWindowHeight return : %{public}s", ErrorCode::ToString(ret)); return ErrorCode::ERROR_IME_NOT_AVAILABLE;
}
return ret;
} }
IMSA_HILOGW("No IME is started [%{public}d]\n", userId_); int ret = core->getKeyboardWindowHeight(retHeight);
return ErrorCode::ERROR_IME_NOT_STARTED; if (ret != ErrorCode::NO_ERROR) {
IMSA_HILOGE("getKeyboardWindowHeight return : %{public}s", ErrorCode::ToString(ret));
}
return ret;
} }
/*! Get the current keyboard type /*! Get the current keyboard type
@ -507,6 +503,7 @@ namespace MiscServices {
void PerUserSession::OnClientDied(sptr<IInputClient> remote) void PerUserSession::OnClientDied(sptr<IInputClient> remote)
{ {
IMSA_HILOGI("PerUserSession::OnClientDied Start...[%{public}d]\n", userId_); IMSA_HILOGI("PerUserSession::OnClientDied Start...[%{public}d]\n", userId_);
SetClientState(false);
sptr<IInputClient> client = GetCurrentClient(); sptr<IInputClient> client = GetCurrentClient();
if (client == nullptr) { if (client == nullptr) {
IMSA_HILOGE("current client is nullptr"); IMSA_HILOGE("current client is nullptr");
@ -530,7 +527,8 @@ namespace MiscServices {
IMSA_HILOGI("Start...[%{public}d]\n", userId_); IMSA_HILOGI("Start...[%{public}d]\n", userId_);
int index = 0; int index = 0;
for (int i = 0; i < MAX_IME; i++) { for (int i = 0; i < MAX_IME; i++) {
if (imsCore[i] == remote) { sptr<IInputMethodCore> core = GetImsCore(i);
if (core == remote) {
index = i; index = i;
break; break;
} }
@ -556,7 +554,7 @@ namespace MiscServices {
} }
usleep(MAX_RESET_WAIT_TIME); usleep(MAX_RESET_WAIT_TIME);
MessageHandler::Instance()->SendMessage(msg); MessageHandler::Instance()->SendMessage(msg);
IMSA_HILOGI("End...[%{public}d]\n", userId_); IMSA_HILOGD("End...[%{public}d]\n", userId_);
} }
/*! It's called when input method setting data in the system is changed /*! It's called when input method setting data in the system is changed
@ -567,16 +565,15 @@ namespace MiscServices {
*/ */
int PerUserSession::OnSettingChanged(const std::u16string& key, const std::u16string& value) int PerUserSession::OnSettingChanged(const std::u16string& key, const std::u16string& value)
{ {
IMSA_HILOGI("Start...[%{public}d]\n", userId_); IMSA_HILOGD("Start...[%{public}d]\n", userId_);
std::lock_guard<std::recursive_mutex> lock(mtx); std::lock_guard<std::recursive_mutex> lock(mtx);
if (!inputMethodSetting) { if (!inputMethodSetting) {
return ErrorCode::ERROR_NULL_POINTER; return ErrorCode::ERROR_NULL_POINTER;
} }
std::u16string currentValue = inputMethodSetting->GetValue(key); std::u16string currentValue = inputMethodSetting->GetValue(key);
IMSA_HILOGD("PerUserSession::OnSettingChanged key = %{public}s", Utils::ToStr8(key).c_str()); IMSA_HILOGD("key = %{public}s, value = %{public}s, currentValue = %{public}s", Utils::ToStr8(key).c_str(),
IMSA_HILOGD("PerUserSession::OnSettingChanged value = %{public}s", Utils::ToStr8(value).c_str()); Utils::ToStr8(value).c_str(), Utils::ToStr8(currentValue).c_str());
IMSA_HILOGD("PerUserSession::OnSettingChanged currentValue = %{public}s", Utils::ToStr8(currentValue).c_str());
if (currentValue == value) { if (currentValue == value) {
IMSA_HILOGI("End...[%{public}d]\n", userId_); IMSA_HILOGI("End...[%{public}d]\n", userId_);
@ -612,7 +609,7 @@ namespace MiscServices {
inputMethodSetting->SetCurrentKeyboardType(-1); inputMethodSetting->SetCurrentKeyboardType(-1);
} }
} }
IMSA_HILOGI("End...[%{public}d]\n", userId_); IMSA_HILOGD("End...[%{public}d]\n", userId_);
return ErrorCode::NO_ERROR; return ErrorCode::NO_ERROR;
} }
@ -659,12 +656,12 @@ namespace MiscServices {
if (type) { if (type) {
sptr<IInputClient> client = GetCurrentClient(); sptr<IInputClient> client = GetCurrentClient();
if (client != nullptr) { if (client != nullptr) {
int ret = imsCore[index]->setKeyboardType(*type); int ret = GetImsCore(index)->setKeyboardType(*type);
if (ret != ErrorCode::NO_ERROR) { if (ret != ErrorCode::NO_ERROR) {
IMSA_HILOGE("setKeyboardType ret: %{public}s [%{public}d]\n", ErrorCode::ToString(ret), userId_); IMSA_HILOGE("setKeyboardType ret: %{public}s [%{public}d]\n", ErrorCode::ToString(ret), userId_);
} }
} }
if (imsCore[index] == imsCore[1 - index]) { if (IsIMEEqual()) {
inputMethodSetting->SetCurrentKeyboardType(type->getHashCode()); inputMethodSetting->SetCurrentKeyboardType(type->getHashCode());
inputMethodSetting->SetCurrentSysKeyboardType(type->getHashCode()); inputMethodSetting->SetCurrentSysKeyboardType(type->getHashCode());
currentKbdIndex[1 - index] = currentKbdIndex[index]; currentKbdIndex[1 - index] = currentKbdIndex[index];
@ -682,7 +679,7 @@ namespace MiscServices {
*/ */
int PerUserSession::OnHideKeyboardSelf(int flags) int PerUserSession::OnHideKeyboardSelf(int flags)
{ {
IMSA_HILOGW("PerUserSession::OnHideKeyboardSelf"); IMSA_HILOGD("PerUserSession::OnHideKeyboardSelf");
(void)flags; (void)flags;
sptr<IInputClient> client = GetCurrentClient(); sptr<IInputClient> client = GetCurrentClient();
if (client == nullptr) { if (client == nullptr) {
@ -694,7 +691,7 @@ namespace MiscServices {
int PerUserSession::OnShowKeyboardSelf() int PerUserSession::OnShowKeyboardSelf()
{ {
IMSA_HILOGI("PerUserSession::OnShowKeyboardSelf"); IMSA_HILOGD("PerUserSession::OnShowKeyboardSelf");
sptr<IInputClient> client = GetCurrentClient(); sptr<IInputClient> client = GetCurrentClient();
if (client == nullptr) { if (client == nullptr) {
IMSA_HILOGE("current client is nullptr"); IMSA_HILOGE("current client is nullptr");
@ -740,7 +737,7 @@ namespace MiscServices {
return; return;
} }
InputMethodSetting tmpSetting; InputMethodSetting tmpSetting;
if (imsCore[index] == imsCore[1 - index]) { if (IsIMEEqual()) {
tmpSetting.SetCurrentKeyboardType(type->getHashCode()); tmpSetting.SetCurrentKeyboardType(type->getHashCode());
tmpSetting.SetCurrentSysKeyboardType(type->getHashCode()); tmpSetting.SetCurrentSysKeyboardType(type->getHashCode());
} }
@ -758,7 +755,6 @@ namespace MiscServices {
*/ */
void PerUserSession::OnSetDisplayMode(int mode) void PerUserSession::OnSetDisplayMode(int mode)
{ {
currentDisplayMode = mode;
sptr<IInputClient> client = GetCurrentClient(); sptr<IInputClient> client = GetCurrentClient();
if (client == nullptr) { if (client == nullptr) {
IMSA_HILOGE("current client is nullptr"); IMSA_HILOGE("current client is nullptr");
@ -784,7 +780,7 @@ namespace MiscServices {
if (index < 0 || index >= MAX_IME) { if (index < 0 || index >= MAX_IME) {
return; return;
} }
IMSA_HILOGI("Start...[%{public}d]\n", userId_); IMSA_HILOGD("Start...[%{public}d]\n", userId_);
if (currentIme[index] && currentIme[index]->mImeId == imeId) { if (currentIme[index] && currentIme[index]->mImeId == imeId) {
int ret = StartInputMethod(index); int ret = StartInputMethod(index);
if (needReshowClient && GetImeIndex(needReshowClient) == index) { if (needReshowClient && GetImeIndex(needReshowClient) == index) {
@ -794,14 +790,14 @@ namespace MiscServices {
needReshowClient = nullptr; needReshowClient = nullptr;
} }
} }
IMSA_HILOGI("End...[%{public}d]\n", userId_); IMSA_HILOGD("End...[%{public}d]\n", userId_);
} }
/*! It's called when this user is locked /*! It's called when this user is locked
*/ */
void PerUserSession::OnUserLocked() void PerUserSession::OnUserLocked()
{ {
IMSA_HILOGI("PerUserSession::OnUserLocked"); IMSA_HILOGD("PerUserSession::OnUserLocked");
std::lock_guard<std::recursive_mutex> lock(mtx); std::lock_guard<std::recursive_mutex> lock(mtx);
if (userState == UserState::USER_STATE_STARTED) { if (userState == UserState::USER_STATE_STARTED) {
IMSA_HILOGI("End...[%{public}d]\n", userId_); IMSA_HILOGI("End...[%{public}d]\n", userId_);
@ -913,13 +909,13 @@ namespace MiscServices {
if (!flag) { if (!flag) {
IMSA_HILOGW("The current keyboard type is not found in the current IME. Reset it!"); IMSA_HILOGW("The current keyboard type is not found in the current IME. Reset it!");
type = GetKeyboardType(imeIndex, currentKbdIndex[imeIndex]); type = GetKeyboardType(imeIndex, currentKbdIndex[imeIndex]);
} else if (imsCore[imeIndex] == imsCore[1 - imeIndex]) { } else if (IsIMEEqual()) {
currentKbdIndex[1 - imeIndex] = currentKbdIndex[imeIndex]; currentKbdIndex[1 - imeIndex] = currentKbdIndex[imeIndex];
} }
} }
if (type) { if (type) {
InputMethodSetting tmpSetting; InputMethodSetting tmpSetting;
if (imsCore[imeIndex] == imsCore[1 - imeIndex]) { if (IsIMEEqual()) {
inputMethodSetting->SetCurrentKeyboardType(type->getHashCode()); inputMethodSetting->SetCurrentKeyboardType(type->getHashCode());
inputMethodSetting->SetCurrentSysKeyboardType(type->getHashCode()); inputMethodSetting->SetCurrentSysKeyboardType(type->getHashCode());
currentKbdIndex[1 - imeIndex] = currentKbdIndex[imeIndex]; currentKbdIndex[1 - imeIndex] = currentKbdIndex[imeIndex];
@ -967,7 +963,7 @@ namespace MiscServices {
*/ */
void PerUserSession::CopyInputMethodService(int imeIndex) void PerUserSession::CopyInputMethodService(int imeIndex)
{ {
imsCore[imeIndex] = imsCore[1 - imeIndex]; SetImsCore(imeIndex, GetImsCore((1 - imeIndex)));
localControlChannel[imeIndex] = localControlChannel[1 - imeIndex]; localControlChannel[imeIndex] = localControlChannel[1 - imeIndex];
inputControlChannel[imeIndex] = inputControlChannel[1 - imeIndex]; inputControlChannel[imeIndex] = inputControlChannel[1 - imeIndex];
inputMethodToken[imeIndex] = inputMethodToken[1 - imeIndex]; inputMethodToken[imeIndex] = inputMethodToken[1 - imeIndex];
@ -1030,12 +1026,18 @@ namespace MiscServices {
sptr<AAFwk::IAbilityManager> PerUserSession::GetAbilityManagerService() sptr<AAFwk::IAbilityManager> PerUserSession::GetAbilityManagerService()
{ {
IMSA_HILOGE("GetAbilityManagerService start"); IMSA_HILOGE("GetAbilityManagerService start");
sptr<IRemoteObject> abilityMsObj = auto systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
OHOS::DelayedSingleton<AAFwk::SaMgrClient>::GetInstance()->GetSystemAbility(ABILITY_MGR_SERVICE_ID); if (systemAbilityManager == nullptr) {
if (!abilityMsObj) { IMSA_HILOGE("SystemAbilityManager is nullptr.");
IMSA_HILOGE("failed to get ability manager service");
return nullptr; return nullptr;
} }
auto abilityMsObj = systemAbilityManager->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
if (abilityMsObj == nullptr) {
IMSA_HILOGE("Failed to get ability manager service.");
return nullptr;
}
return iface_cast<AAFwk::IAbilityManager>(abilityMsObj); return iface_cast<AAFwk::IAbilityManager>(abilityMsObj);
} }
@ -1046,7 +1048,7 @@ namespace MiscServices {
*/ */
int32_t PerUserSession::OnPrepareInput(const ClientInfo &clientInfo) int32_t PerUserSession::OnPrepareInput(const ClientInfo &clientInfo)
{ {
IMSA_HILOGI("PerUserSession::OnPrepareInput Start\n"); IMSA_HILOGD("PerUserSession::OnPrepareInput Start\n");
int ret = AddClient(clientInfo.client->AsObject(), clientInfo); int ret = AddClient(clientInfo.client->AsObject(), clientInfo);
if (ret != ErrorCode::NO_ERROR) { if (ret != ErrorCode::NO_ERROR) {
IMSA_HILOGE("PerUserSession::OnPrepareInput %{public}s", ErrorCode::ToString(ret)); IMSA_HILOGE("PerUserSession::OnPrepareInput %{public}s", ErrorCode::ToString(ret));
@ -1058,7 +1060,7 @@ namespace MiscServices {
void PerUserSession::SendAgentToSingleClient(const ClientInfo &clientInfo) void PerUserSession::SendAgentToSingleClient(const ClientInfo &clientInfo)
{ {
IMSA_HILOGI("PerUserSession::SendAgentToSingleClient"); IMSA_HILOGD("PerUserSession::SendAgentToSingleClient");
if (imsAgent == nullptr) { if (imsAgent == nullptr) {
IMSA_HILOGI("PerUserSession::SendAgentToSingleClient imsAgent is nullptr"); IMSA_HILOGI("PerUserSession::SendAgentToSingleClient imsAgent is nullptr");
CreateComponentFailed(userId_, ErrorCode::ERROR_NULL_POINTER); CreateComponentFailed(userId_, ErrorCode::ERROR_NULL_POINTER);
@ -1074,14 +1076,19 @@ namespace MiscServices {
*/ */
int32_t PerUserSession::OnReleaseInput(sptr<IInputClient> client) int32_t PerUserSession::OnReleaseInput(sptr<IInputClient> client)
{ {
IMSA_HILOGI("PerUserSession::OnReleaseInput Start\n"); IMSA_HILOGI("PerUserSession::OnReleaseInput Start");
if (imsCore[0] == nullptr) { int ret = SetClientState(false);
return ErrorCode::ERROR_IME_NOT_AVAILABLE; if (ret != ErrorCode::NO_ERROR) {
IMSA_HILOGE("failed to set client state, ret %{public}d", ret);
return ret;
}
ret = HideKeyboard(client);
if (ret != ErrorCode::NO_ERROR) {
IMSA_HILOGE("failed to hide keyboard ret %{public}d", ret);
return ret;
} }
imsCore[0]->SetClientState(false);
HideKeyboard(client);
RemoveClient(client->AsObject()); RemoveClient(client->AsObject());
IMSA_HILOGI("PerUserSession::OnReleaseInput End...[%{public}d]\n", userId_); IMSA_HILOGD("PerUserSession::OnReleaseInput End...[%{public}d]\n", userId_);
return ErrorCode::NO_ERROR; return ErrorCode::NO_ERROR;
} }
@ -1093,21 +1100,22 @@ namespace MiscServices {
int32_t PerUserSession::OnStartInput(sptr<IInputClient> client, bool isShowKeyboard) int32_t PerUserSession::OnStartInput(sptr<IInputClient> client, bool isShowKeyboard)
{ {
IMSA_HILOGI("PerUserSession::OnStartInput"); IMSA_HILOGI("PerUserSession::OnStartInput");
if (imsCore[0] == nullptr) { int32_t ret = SetClientState(true);
return ErrorCode::ERROR_IME_NOT_AVAILABLE; if (ret != ErrorCode::NO_ERROR) {
IMSA_HILOGE("failed to set client state");
return ret;
} }
imsCore[0]->SetClientState(true);
return ShowKeyboard(client, isShowKeyboard); return ShowKeyboard(client, isShowKeyboard);
} }
int32_t PerUserSession::OnSetCoreAndAgent(sptr<IInputMethodCore> core, sptr<IInputMethodAgent> agent) int32_t PerUserSession::OnSetCoreAndAgent(sptr<IInputMethodCore> core, sptr<IInputMethodAgent> agent)
{ {
IMSA_HILOGI("PerUserSession::SetCoreAndAgent Start\n"); IMSA_HILOGD("PerUserSession::SetCoreAndAgent Start\n");
if (core == nullptr || agent == nullptr) { if (core == nullptr || agent == nullptr) {
IMSA_HILOGE("PerUserSession::SetCoreAndAgent core or agent nullptr"); IMSA_HILOGE("PerUserSession::SetCoreAndAgent core or agent nullptr");
return ErrorCode::ERROR_EX_NULL_POINTER; return ErrorCode::ERROR_EX_NULL_POINTER;
} }
imsCore[0] = core; SetImsCore(DEFAULT_IME, core);
if (imsDeathRecipient != nullptr) { if (imsDeathRecipient != nullptr) {
imsDeathRecipient->SetDeathRecipient([this, core](const wptr<IRemoteObject> &) { this->OnImsDied(core); }); imsDeathRecipient->SetDeathRecipient([this, core](const wptr<IRemoteObject> &) { this->OnImsDied(core); });
bool ret = core->AsObject()->AddDeathRecipient(imsDeathRecipient); bool ret = core->AsObject()->AddDeathRecipient(imsDeathRecipient);
@ -1121,7 +1129,7 @@ namespace MiscServices {
void PerUserSession::SendAgentToAllClients() void PerUserSession::SendAgentToAllClients()
{ {
IMSA_HILOGI("PerUserSession::SendAgentToAllClients"); IMSA_HILOGD("PerUserSession::SendAgentToAllClients");
std::lock_guard<std::recursive_mutex> lock(mtx); std::lock_guard<std::recursive_mutex> lock(mtx);
if (imsAgent == nullptr) { if (imsAgent == nullptr) {
IMSA_HILOGE("PerUserSession::SendAgentToAllClients imsAgent is nullptr"); IMSA_HILOGE("PerUserSession::SendAgentToAllClients imsAgent is nullptr");
@ -1138,9 +1146,14 @@ namespace MiscServices {
void PerUserSession::InitInputControlChannel() void PerUserSession::InitInputControlChannel()
{ {
IMSA_HILOGI("PerUserSession::InitInputControlChannel"); IMSA_HILOGD("PerUserSession::InitInputControlChannel");
sptr<IInputControlChannel> inputControlChannel = new InputControlChannelStub(userId_); sptr<IInputControlChannel> inputControlChannel = new InputControlChannelStub(userId_);
int ret = imsCore[0]->InitInputControlChannel(inputControlChannel); sptr<IInputMethodCore> core = GetImsCore(DEFAULT_IME);
if (core == nullptr) {
IMSA_HILOGE("PerUserSession::InitInputControlChannel core is nullptr");
return;
}
int ret = core->InitInputControlChannel(inputControlChannel);
if (ret != ErrorCode::NO_ERROR) { if (ret != ErrorCode::NO_ERROR) {
IMSA_HILOGI("PerUserSession::InitInputControlChannel fail %{public}s", ErrorCode::ToString(ret)); IMSA_HILOGI("PerUserSession::InitInputControlChannel fail %{public}s", ErrorCode::ToString(ret));
} }
@ -1153,25 +1166,26 @@ namespace MiscServices {
*/ */
int32_t PerUserSession::OnStopInput(sptr<IInputClient> client) int32_t PerUserSession::OnStopInput(sptr<IInputClient> client)
{ {
IMSA_HILOGI("PerUserSession::OnStopInput"); IMSA_HILOGD("PerUserSession::OnStopInput");
return HideKeyboard(client); return HideKeyboard(client);
} }
void PerUserSession::StopInputService(std::string imeId) void PerUserSession::StopInputService(std::string imeId)
{ {
IMSA_HILOGI("PerUserSession::StopInputService"); IMSA_HILOGI("PerUserSession::StopInputService");
if (imsCore[0] == nullptr) { sptr<IInputMethodCore> core = GetImsCore(DEFAULT_IME);
if (core == nullptr) {
IMSA_HILOGE("imsCore[0] is nullptr"); IMSA_HILOGE("imsCore[0] is nullptr");
return; return;
} }
IMSA_HILOGI("Remove death recipient"); IMSA_HILOGI("Remove death recipient");
imsCore[0]->AsObject()->RemoveDeathRecipient(imsDeathRecipient); core->AsObject()->RemoveDeathRecipient(imsDeathRecipient);
imsCore[0]->StopInputService(imeId); core->StopInputService(imeId);
} }
bool PerUserSession::IsRestartIme(uint32_t index) bool PerUserSession::IsRestartIme(uint32_t index)
{ {
IMSA_HILOGI("PerUserSession::IsRestartIme"); IMSA_HILOGD("PerUserSession::IsRestartIme");
std::lock_guard<std::mutex> lock(resetLock); std::lock_guard<std::mutex> lock(resetLock);
auto now = time(nullptr); auto now = time(nullptr);
if (difftime(now, manager[index].last) > IME_RESET_TIME_OUT) { if (difftime(now, manager[index].last) > IME_RESET_TIME_OUT) {
@ -1191,9 +1205,10 @@ namespace MiscServices {
void PerUserSession::ClearImeData(uint32_t index) void PerUserSession::ClearImeData(uint32_t index)
{ {
IMSA_HILOGI("Clear ime...index = %{public}d", index); IMSA_HILOGI("Clear ime...index = %{public}d", index);
if (imsCore[index] != nullptr) { sptr<IInputMethodCore> core = GetImsCore(index);
imsCore[index]->AsObject()->RemoveDeathRecipient(imsDeathRecipient); if (core != nullptr) {
imsCore[index] = nullptr; core->AsObject()->RemoveDeathRecipient(imsDeathRecipient);
SetImsCore(index, nullptr);
} }
inputControlChannel[index] = nullptr; inputControlChannel[index] = nullptr;
localControlChannel[index] = nullptr; localControlChannel[index] = nullptr;
@ -1215,7 +1230,7 @@ namespace MiscServices {
int32_t PerUserSession::OnInputMethodSwitched(const Property &property, const SubProperty &subProperty) int32_t PerUserSession::OnInputMethodSwitched(const Property &property, const SubProperty &subProperty)
{ {
IMSA_HILOGI("PerUserSession::OnInputMethodSwitched"); IMSA_HILOGD("PerUserSession::OnInputMethodSwitched");
std::lock_guard<std::recursive_mutex> lock(mtx); std::lock_guard<std::recursive_mutex> lock(mtx);
for (const auto &client : mapClients) { for (const auto &client : mapClients) {
auto clientInfo = client.second; auto clientInfo = client.second;
@ -1234,11 +1249,12 @@ namespace MiscServices {
return ErrorCode::NO_ERROR; return ErrorCode::NO_ERROR;
} }
SetCurrentSubProperty(subProperty); SetCurrentSubProperty(subProperty);
if (imsCore[0] == nullptr) { sptr<IInputMethodCore> core = GetImsCore(DEFAULT_IME);
if (core == nullptr) {
IMSA_HILOGE("imsCore is nullptr"); IMSA_HILOGE("imsCore is nullptr");
return ErrorCode::ERROR_EX_NULL_POINTER; return ErrorCode::ERROR_EX_NULL_POINTER;
} }
int32_t ret = imsCore[0]->SetSubtype(subProperty); int32_t ret = core->SetSubtype(subProperty);
if (ret != ErrorCode::NO_ERROR) { if (ret != ErrorCode::NO_ERROR) {
IMSA_HILOGE("PerUserSession::SetSubtype failed, ret %{public}d", ret); IMSA_HILOGE("PerUserSession::SetSubtype failed, ret %{public}d", ret);
return ret; return ret;
@ -1248,16 +1264,46 @@ namespace MiscServices {
SubProperty PerUserSession::GetCurrentSubProperty() SubProperty PerUserSession::GetCurrentSubProperty()
{ {
IMSA_HILOGI("PerUserSession::GetCurrentSubProperty"); IMSA_HILOGD("PerUserSession::GetCurrentSubProperty");
std::lock_guard<std::mutex> lock(propertyLock_); std::lock_guard<std::mutex> lock(propertyLock_);
return currentSubProperty; return currentSubProperty;
} }
void PerUserSession::SetCurrentSubProperty(const SubProperty &subProperty) void PerUserSession::SetCurrentSubProperty(const SubProperty &subProperty)
{ {
IMSA_HILOGI("PerUserSession::SetCurrentSubProperty"); IMSA_HILOGD("PerUserSession::SetCurrentSubProperty");
std::lock_guard<std::mutex> lock(propertyLock_); std::lock_guard<std::mutex> lock(propertyLock_);
currentSubProperty = subProperty; currentSubProperty = subProperty;
} }
sptr<IInputMethodCore> PerUserSession::GetImsCore(int32_t index)
{
std::lock_guard<std::mutex> lock(imsCoreLock_);
if (!IsValid(index)) {
return nullptr;
}
return imsCore[index];
}
void PerUserSession::SetImsCore(int32_t index, sptr<IInputMethodCore> core)
{
std::lock_guard<std::mutex> lock(imsCoreLock_);
if (!IsValid(index)) {
return;
}
imsCore[index] = core;
}
int32_t PerUserSession::SetClientState(bool isAlive)
{
IMSA_HILOGD("set client state %{public}s", isAlive ? "alive" : "dead");
auto core = GetImsCore(DEFAULT_IME);
if (core == nullptr) {
IMSA_HILOGE("imsCore is nullptr");
return ErrorCode::ERROR_EX_NULL_POINTER;
}
core->SetClientState(isAlive);
return ErrorCode::NO_ERROR;
}
} // namespace MiscServices } // namespace MiscServices
} // namespace OHOS } // namespace OHOS

View File

@ -167,7 +167,7 @@ namespace MiscServices {
return ErrorCode::NO_ERROR; return ErrorCode::NO_ERROR;
} }
Platform::Instance()->SetInputMethodSetting(userId_, imSetting); Platform::Instance()->SetInputMethodSetting(userId_, imSetting);
// wait for some time so that the setting change will not be overrided by the followed transact // wait for some time so that the setting change will not be override by the followed transact
usleep(COMMON_COUNT_ONE_HUNDRED_THOUSAND); usleep(COMMON_COUNT_ONE_HUNDRED_THOUSAND);
return ErrorCode::NO_ERROR; return ErrorCode::NO_ERROR;
} }

View File

@ -22,6 +22,12 @@ group("fuzztest") {
"corestub_fuzzer:fuzztest", "corestub_fuzzer:fuzztest",
"datachannelstub_fuzzer:fuzztest", "datachannelstub_fuzzer:fuzztest",
"inputclientstub_fuzzer:fuzztest", "inputclientstub_fuzzer:fuzztest",
"inputmethod_fuzzer:fuzztest",
"inputmethodability_fuzzer:fuzztest",
"inputmethodcontroller_fuzzer:fuzztest",
"inputmethodsetting_fuzzer:fuzztest",
"perusersession_fuzzer:fuzztest",
"perusersetting_fuzzer:fuzztest",
"platformcallbackstub_fuzzer:fuzztest", "platformcallbackstub_fuzzer:fuzztest",
"systemabilitystub_fuzzer:fuzztest", "systemabilitystub_fuzzer:fuzztest",
] ]

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021 Huawei Device Co., Ltd. # Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
# You may obtain a copy of the License at # You may obtain a copy of the License at

View File

@ -52,6 +52,8 @@ namespace OHOS {
MessageOption option; MessageOption option;
sptr<InputMethodAgentStub> stub = new InputMethodAgentStub(); sptr<InputMethodAgentStub> stub = new InputMethodAgentStub();
MessageHandler *handler = MessageHandler::Instance();
stub->SetMessageHandler(handler);
stub->OnRemoteRequest(code, data, reply, option); stub->OnRemoteRequest(code, data, reply, option);
return true; return true;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021 Huawei Device Co., Ltd. * Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
@ -18,4 +18,4 @@
#define FUZZ_PROJECT_NAME "agentstub_fuzzer" #define FUZZ_PROJECT_NAME "agentstub_fuzzer"
#endif // TEST_FUZZTEST_AGENTSTUB_FUZZER_AGENTSTUB_FUZZER_H #endif // TEST_FUZZTEST_AGENTSTUB_FUZZER_AGENTSTUB_FUZZER_H

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2021 Huawei Device Co., Ltd. <!-- Copyright (c) 2022 Huawei Device Co., Ltd.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021 Huawei Device Co., Ltd. # Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
# You may obtain a copy of the License at # You may obtain a copy of the License at

View File

@ -28,7 +28,7 @@ using namespace OHOS::MiscServices;
namespace OHOS { namespace OHOS {
constexpr size_t THRESHOLD = 10; constexpr size_t THRESHOLD = 10;
constexpr int32_t OFFSET = 4; constexpr int32_t OFFSET = 4;
const std::u16string CONTROLLCHANNEL_INTERFACE_TOKEN = u"ohos.miscservices.inputmethod.InputControlChannel"; const std::u16string CONTROLCHANNEL_INTERFACE_TOKEN = u"ohos.miscservices.inputmethod.InputControlChannel";
uint32_t ConvertToUint32(const uint8_t *ptr) uint32_t ConvertToUint32(const uint8_t *ptr)
{ {
@ -46,14 +46,14 @@ namespace OHOS {
size = size - OFFSET; size = size - OFFSET;
MessageParcel data; MessageParcel data;
data.WriteInterfaceToken(CONTROLLCHANNEL_INTERFACE_TOKEN); data.WriteInterfaceToken(CONTROLCHANNEL_INTERFACE_TOKEN);
data.WriteBuffer(rawData, size); data.WriteBuffer(rawData, size);
data.RewindRead(0); data.RewindRead(0);
MessageParcel reply; MessageParcel reply;
MessageOption option; MessageOption option;
sptr<InputControlChannelStub> controllChannel = new InputControlChannelStub(MAIN_USER_ID); sptr<InputControlChannelStub> controlChannel = new InputControlChannelStub(MAIN_USER_ID);
controllChannel->OnRemoteRequest(code, data, reply, option); controlChannel->OnRemoteRequest(code, data, reply, option);
return true; return true;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021 Huawei Device Co., Ltd. * Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
@ -13,11 +13,9 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef TEST_FUZZTEST_CONTROLLCHANNELSTUB_FUZZER_CONTROLLCHANNELSTUB_FUZZER_H #ifndef TEST_FUZZTEST_CONTROLCHANNELSTUB_FUZZER_CONTROLCHANNELSTUB_FUZZER_H
#define TEST_FUZZTEST_CONTROLLCHANNELSTUB_FUZZER_CONTROLLCHANNELSTUB_FUZZER_H #define TEST_FUZZTEST_CONTROLCHANNELSTUB_FUZZER_CONTROLCHANNELSTUB_FUZZER_H
#define FUZZ_PROJECT_NAME "controlchannelstub_fuzzer" #define FUZZ_PROJECT_NAME "controlchannelstub_fuzzer"
#endif // TEST_FUZZTEST_CONTROLLCHANNELSTUB_FUZZER_CONTROLLCHANNELSTUB_FUZZER_H #endif // TEST_FUZZTEST_CONTROLCHANNELSTUB_FUZZER_CONTROLCHANNELSTUB_FUZZER_H

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2021 Huawei Device Co., Ltd. <!-- Copyright (c) 2022 Huawei Device Co., Ltd.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021 Huawei Device Co., Ltd. # Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
# You may obtain a copy of the License at # You may obtain a copy of the License at

View File

@ -53,6 +53,8 @@ namespace OHOS {
MessageOption option; MessageOption option;
sptr<InputMethodCoreStub> stub = new InputMethodCoreStub(MAIN_USER_ID); sptr<InputMethodCoreStub> stub = new InputMethodCoreStub(MAIN_USER_ID);
MessageHandler *handler = MessageHandler::Instance();
stub->SetMessageHandler(handler);
stub->OnRemoteRequest(code, data, reply, option); stub->OnRemoteRequest(code, data, reply, option);
return true; return true;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021 Huawei Device Co., Ltd. * Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
@ -18,6 +18,4 @@
#define FUZZ_PROJECT_NAME "corestub_fuzzer" #define FUZZ_PROJECT_NAME "corestub_fuzzer"
#endif // TEST_FUZZTEST_CORESTUB_FUZZER_CORESTUB_FUZZER_H #endif // TEST_FUZZTEST_CORESTUB_FUZZER_CORESTUB_FUZZER_H

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2021 Huawei Device Co., Ltd. <!-- Copyright (c) 2022 Huawei Device Co., Ltd.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021 Huawei Device Co., Ltd. # Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
# You may obtain a copy of the License at # You may obtain a copy of the License at

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021 Huawei Device Co., Ltd. * Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
@ -18,5 +18,4 @@
#define FUZZ_PROJECT_NAME "datachannelstub_fuzzer" #define FUZZ_PROJECT_NAME "datachannelstub_fuzzer"
#endif // TEST_FUZZTEST_DATACHANNELSTUB_FUZZER_DATACHANNELSTUB_FUZZER_H #endif // TEST_FUZZTEST_DATACHANNELSTUB_FUZZER_DATACHANNELSTUB_FUZZER_H

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2021 Huawei Device Co., Ltd. <!-- Copyright (c) 2022 Huawei Device Co., Ltd.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021 Huawei Device Co., Ltd. # Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
# You may obtain a copy of the License at # You may obtain a copy of the License at
@ -41,6 +41,7 @@ ohos_fuzztest("InputClientStubFuzzTest") {
sources = [ "inputclientstub_fuzzer.cpp" ] sources = [ "inputclientstub_fuzzer.cpp" ]
deps = [ deps = [
"//base/inputmethod/imf/frameworks/inputmethod_ability:inputmethod_ability",
"//base/inputmethod/imf/frameworks/inputmethod_controller:inputmethod_client", "//base/inputmethod/imf/frameworks/inputmethod_controller:inputmethod_client",
"//base/inputmethod/imf/services:inputmethod_service", "//base/inputmethod/imf/services:inputmethod_service",
"//foundation/ability/ability_runtime/services/abilitymgr:abilityms", "//foundation/ability/ability_runtime/services/abilitymgr:abilityms",

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021 Huawei Device Co., Ltd. * Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
@ -13,57 +13,96 @@
* limitations under the License. * limitations under the License.
*/ */
#include "inputclientstub_fuzzer.h" #include "inputclientstub_fuzzer.h"
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include <input_method_agent_stub.h>
#include "input_client_stub.h"
#include "global.h" #include "global.h"
#include "input_client_stub.h"
#include "message_parcel.h" #include "message_parcel.h"
using namespace OHOS::MiscServices; using namespace OHOS::MiscServices;
namespace OHOS { namespace OHOS {
constexpr size_t THRESHOLD = 10; constexpr size_t THRESHOLD = 10;
constexpr int32_t OFFSET = 4; constexpr int32_t OFFSET = 4;
const std::u16string INPUTCLIENTSTUB_INTERFACE_TOKEN = u"ohos.miscservices.inputmethod.InputClient"; const std::u16string INPUTCLIENTSTUB_INTERFACE_TOKEN = u"ohos.miscservices.inputmethod.InputClient";
uint32_t ConvertToUint32(const uint8_t *ptr) uint32_t ConvertToUint32(const uint8_t *ptr)
{ {
if (ptr == nullptr) { if (ptr == nullptr) {
return 0; return 0;
}
uint32_t bigVar = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
return bigVar;
}
bool FuzzInputClientStub(const uint8_t* rawData, size_t size)
{
uint32_t code = ConvertToUint32(rawData);
rawData = rawData + OFFSET;
size = size - OFFSET;
MessageParcel data;
data.WriteInterfaceToken(INPUTCLIENTSTUB_INTERFACE_TOKEN);
data.WriteBuffer(rawData, size);
data.RewindRead(0);
MessageParcel reply;
MessageOption option;
sptr<InputClientStub> mClient = new InputClientStub;
mClient->OnRemoteRequest(code, data, reply, option);
return true;
} }
uint32_t bigVar = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
return bigVar;
} }
void FuzzInputClientStub(const uint8_t *rawData, size_t size)
{
uint32_t code = ConvertToUint32(rawData);
rawData = rawData + OFFSET;
size = size - OFFSET;
MessageParcel data;
data.WriteInterfaceToken(INPUTCLIENTSTUB_INTERFACE_TOKEN);
data.WriteBuffer(rawData, size);
data.RewindRead(0);
MessageParcel reply;
MessageOption option;
sptr<InputClientStub> mClient = new InputClientStub();
MessageHandler *handler = MessageHandler::Instance();
mClient->SetHandler(handler);
mClient->OnRemoteRequest(code, data, reply, option);
}
void TextOnInputReady()
{
sptr<InputClientStub> mClient = new InputClientStub();
sptr<InputMethodAgentStub> mInputMethodAgentStub = new InputMethodAgentStub();
MessageParcel data;
data.WriteRemoteObject(mInputMethodAgentStub->AsObject());
auto remoteObject = data.ReadRemoteObject();
sptr<IInputMethodAgent> iface = iface_cast<IInputMethodAgent>(remoteObject);
mClient->onInputReady(iface);
}
void TestOnInputReleased(int32_t fuzzedInt32)
{
sptr<InputClientStub> mClient = new InputClientStub();
mClient->onInputReleased(fuzzedInt32);
}
void TestSetDisplayMode(int32_t fuzzedInt32)
{
sptr<InputClientStub> mClient = new InputClientStub();
mClient->setDisplayMode(fuzzedInt32);
}
void TestOnSwitchInput()
{
sptr<InputClientStub> mClient = new InputClientStub();
Property property = {};
SubProperty subProperty = {};
mClient->OnSwitchInput(property, subProperty);
}
} // namespace OHOS
/* Fuzzer entry point */ /* Fuzzer entry point */
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{ {
if (size < OHOS::THRESHOLD) { if (size < OHOS::THRESHOLD) {
return 0; return 0;
} }
/* Run your code on data */ /* Run your code on data */
auto fuzzedInt32 = static_cast<int32_t>(size);
OHOS::FuzzInputClientStub(data, size); OHOS::FuzzInputClientStub(data, size);
OHOS::TextOnInputReady();
OHOS::TestOnInputReleased(fuzzedInt32);
OHOS::TestSetDisplayMode(fuzzedInt32);
OHOS::TestOnSwitchInput();
return 0; return 0;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021 Huawei Device Co., Ltd. * Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2021 Huawei Device Co., Ltd. <!-- Copyright (c) 2022 Huawei Device Co., Ltd.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

View File

@ -0,0 +1,69 @@
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/inputmethod/imf/inputmethod.gni")
#####################hydra-fuzz###################
import("//build/config/features.gni")
import("//build/ohos.gni")
import("//build/test.gni")
##############################fuzztest##########################################
ohos_fuzztest("InputMethodFuzzTest") {
module_out_path = "inputmethod/inputmethod"
fuzz_config_file = "//base/inputmethod/imf/test/fuzztest/inputmethod_fuzzer"
include_dirs = [
"//base/inputmethod/imf/services/include",
"//base/inputmethod/imf/services/adapter/keyboard/include",
"//base/inputmethod/imf/etc/para/include",
"//foundation/ability/ability_runtime/interfaces/inner_api/app_manager/include/appmgr",
"//foundation/ability/ability_runtime/services/abilitymgr/include",
"//foundation/ability/ability_runtime/interfaces/inner_api/ability_manager/include",
]
cflags = [
"-g",
"-O0",
"-Wno-unused-variable",
"-fno-omit-frame-pointer",
]
sources = [ "inputmethod_fuzzer.cpp" ]
deps = [
"//base/inputmethod/imf/etc/para:inputmethod_para",
"//base/inputmethod/imf/frameworks/inputmethod_controller:inputmethod_client",
"//base/inputmethod/imf/services:inputmethod_service",
"//foundation/ability/ability_base:want",
"//foundation/ability/ability_runtime/services/abilitymgr:abilityms",
"//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core",
]
external_deps = [
"c_utils:utils",
"hiviewdfx_hilog_native:libhilog",
]
}
###############################################################################
group("fuzztest") {
testonly = true
deps = []
deps += [
# deps file
":InputMethodFuzzTest",
]
}
###############################################################################

View File

@ -0,0 +1,14 @@
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
FUZZ

View File

@ -0,0 +1,91 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "inputmethod_fuzzer.h"
#include <cstddef>
#include <cstdint>
#include "global.h"
#include "i_platform_callback.h"
#include "input_client_stub.h"
#include "input_method_controller.h"
#include "keyboard_event.h"
#include "message_handler.h"
#include "message_parcel.h"
#include "para_handle.h"
#include "platform.h"
#include "utils.h"
using namespace OHOS::MiscServices;
namespace OHOS {
class TextListener : public OnTextChangedListener {
public:
TextListener() {}
~TextListener() {}
void InsertText(const std::u16string& text) {}
void DeleteBackward(int32_t length) {}
void SetKeyboardStatus(bool status) {}
void DeleteForward(int32_t length) {}
void SendKeyEventFromInputMethod(const KeyEvent& event) {}
void SendKeyboardInfo(const KeyboardInfo& status) {}
void MoveCursor(const Direction direction) {}
};
bool FuzzParaHandle(const uint8_t *rawData, size_t size)
{
int32_t userId = static_cast<int32_t>(*rawData);
std::string imeName = std::string(rawData, rawData + size);
ParaHandle::SetDefaultIme(userId, imeName);
return true;
}
bool FuzzPlatform(const uint8_t *rawData, size_t size)
{
int32_t data = static_cast<int32_t>(*rawData);
std::vector<InputMethodInfo *> *properties = {};
InputMethodInfo *inputMethodProperty = new InputMethodInfo();
InputMethodSetting *inputMethodSetting = new InputMethodSetting();
std::u16string packageName = Str8ToStr16(std::string(rawData, rawData + size));
std::u16string intention = Str8ToStr16(std::string(rawData, rawData + size));
MiscServices::Platform::Instance()->BindInputMethodService(data, packageName, intention);
MiscServices::Platform::Instance()->UnbindInputMethodService(data, packageName);
MiscServices::Platform::Instance()->CreateWindowToken(data, data, packageName);
MiscServices::Platform::Instance()->DestroyWindowToken(data, packageName);
MiscServices::Platform::Instance()->ListInputMethod(data, properties);
MiscServices::Platform::Instance()->GetInputMethodProperty(data, packageName, inputMethodProperty);
MiscServices::Platform::Instance()->GetInputMethodSetting(data, inputMethodSetting);
MiscServices::Platform::Instance()->SetInputMethodSetting(data, *inputMethodSetting);
MiscServices::Platform::Instance()->CheckPhysicalKeyboard();
MiscServices::Platform::Instance()->IsValidWindow(data, data, data);
MiscServices::Platform::Instance()->IsWindowFocused(data, data, data);
delete inputMethodProperty;
inputMethodProperty = nullptr;
delete inputMethodSetting;
inputMethodSetting = nullptr;
return true;
}
}
/* Fuzzer entry point */
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
{
/* Run your code on data */
OHOS::FuzzParaHandle(data, size);
OHOS::FuzzPlatform(data, size);
return 0;
}

View File

@ -0,0 +1,21 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef TEST_FUZZTEST_INPUTMETHOD_FUZZER_INPUTMETHOD_FUZZER_H
#define TEST_FUZZTEST_INPUTMETHOD_FUZZER_INPUTMETHOD_FUZZER_H
#define FUZZ_PROJECT_NAME "inputmethod_fuzzer"
#endif // TEST_FUZZTEST_INPUTMETHOD_FUZZER_INPUTMETHOD_FUZZER_H

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2022 Huawei Device Co., Ltd.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<fuzz_config>
<fuzztest>
<!-- maximum length of a test input -->
<max_len>1000</max_len>
<!-- maximum total time in seconds to run the fuzzer -->
<max_total_time>300</max_total_time>
<!-- memory usage limit in Mb -->
<rss_limit_mb>4096</rss_limit_mb>
</fuzztest>
</fuzz_config>

View File

@ -0,0 +1,62 @@
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/inputmethod/imf/inputmethod.gni")
#####################hydra-fuzz###################
import("//build/config/features.gni")
import("//build/ohos.gni")
import("//build/test.gni")
##############################fuzztest##########################################
ohos_fuzztest("InputMethodAbilityFuzzTest") {
module_out_path = "inputmethod/inputmethod"
fuzz_config_file =
"//base/inputmethod/imf/test/fuzztest/inputmethodability_fuzzer"
include_dirs = [
"//base/inputmethod/imf/services/include",
"//foundation/ability/ability_runtime/interfaces/inner_api/app_manager/include/appmgr",
"//foundation/ability/ability_runtime/services/abilitymgr/include",
]
cflags = [
"-g",
"-O0",
"-Wno-unused-variable",
"-fno-omit-frame-pointer",
]
sources = [ "inputmethodability_fuzzer.cpp" ]
deps = [
"//base/inputmethod/imf/frameworks/inputmethod_ability:inputmethod_ability",
"//base/inputmethod/imf/services:inputmethod_service",
"//foundation/ability/ability_runtime/services/abilitymgr:abilityms",
"//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core",
]
external_deps = [
"c_utils:utils",
"hiviewdfx_hilog_native:libhilog",
]
}
###############################################################################
group("fuzztest") {
testonly = true
deps = []
deps += [ ":InputMethodAbilityFuzzTest" ]
}
###############################################################################

View File

@ -0,0 +1,14 @@
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
FUZZ

View File

@ -0,0 +1,173 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "inputmethodability_fuzzer.h"
#include <utility>
#include "input_method_ability.h"
using namespace OHOS::MiscServices;
namespace OHOS {
class EngineListener : public InputMethodEngineListener {
void OnKeyboardStatus(bool isShow) {}
void OnInputStart() {}
void OnInputStop(std::string imeId) {}
void OnSetCallingWindow(uint32_t windowId) {}
void OnSetSubtype(const SubProperty &property) {}
};
class KeyboardListenerImpl : public KeyboardListener {
bool OnKeyEvent(int32_t keyCode, int32_t keyStatus)
{
return true;
}
void OnCursorUpdate(int32_t positionX, int32_t positionY, int32_t height) {}
void OnSelectionChange(int32_t oldBegin, int32_t oldEnd, int32_t newBegin, int32_t newEnd) {}
void OnTextChange(std::string text) {}
};
void TestInsertText(std::string fuzzedString)
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
ability->InsertText(std::move(fuzzedString));
}
void TestSetImeListener()
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
auto engineListener = std::make_shared<EngineListener>();
ability->setImeListener(engineListener);
}
void TestSetKdListener()
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
auto keyBoardListener = std::make_shared<KeyboardListenerImpl>();
ability->setKdListener(keyBoardListener);
}
void TestDeleteForward(int32_t fuzzedInt32)
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
ability->DeleteForward(fuzzedInt32);
}
void TestDeleteBackward(int32_t fuzzedInt32)
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
ability->DeleteBackward(fuzzedInt32);
}
void TestHideKeyboardSelf()
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
ability->HideKeyboardSelf();
}
void TestGetTextBeforeCursor(int32_t fuzzedInt32)
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
std::u16string text;
ability->GetTextBeforeCursor(fuzzedInt32, text);
}
void TestGetTextAfterCursor(int32_t fuzzedInt32)
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
std::u16string text;
ability->GetTextAfterCursor(fuzzedInt32, text);
}
void TestSendFunctionKey(int32_t fuzzedInt32)
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
ability->SendFunctionKey(fuzzedInt32);
}
void TestMoveCursor(int32_t fuzzedInt32)
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
ability->MoveCursor(fuzzedInt32);
}
void TestDispatchKeyEvent(int32_t fuzzedInt32)
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
ability->DispatchKeyEvent(fuzzedInt32, fuzzedInt32);
}
void TestSetCallingWindow(int32_t fuzzedInt32)
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
ability->SetCallingWindow(fuzzedInt32);
}
void TestGetEnterKeyType()
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
int32_t keyType;
ability->GetEnterKeyType(keyType);
}
void TestGetInputPattern()
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
int32_t inputPattern;
ability->GetInputPattern(inputPattern);
}
void TestStopInput()
{
sptr<InputMethodAbility> ability = InputMethodAbility::GetInstance();
ability->StopInput();
}
} // namespace OHOS
/* Fuzzer entry point */
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
/* Run your code on data */
std::string fuzzedString(reinterpret_cast<const char *>(data), size);
auto fuzzedInt32 = static_cast<int32_t>(size);
OHOS::TestInsertText(fuzzedString);
OHOS::TestSetImeListener();
OHOS::TestSetKdListener();
OHOS::TestDeleteForward(fuzzedInt32);
OHOS::TestDeleteBackward(fuzzedInt32);
OHOS::TestHideKeyboardSelf();
OHOS::TestGetTextBeforeCursor(fuzzedInt32);
OHOS::TestGetTextAfterCursor(fuzzedInt32);
OHOS::TestSendFunctionKey(fuzzedInt32);
OHOS::TestMoveCursor(fuzzedInt32);
OHOS::TestDispatchKeyEvent(fuzzedInt32);
OHOS::TestSetCallingWindow(fuzzedInt32);
OHOS::TestGetEnterKeyType();
OHOS::TestGetInputPattern();
OHOS::TestStopInput();
return 0;
}

View File

@ -0,0 +1,21 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef INPUTMETHOD_IMF_CHOOSEDIALOG_INPUTMETHODABILITY_FUZZER_H
#define INPUTMETHOD_IMF_CHOOSEDIALOG_INPUTMETHODABILITY_FUZZER_H
#define FUZZ_PROJECT_NAME "inputmethodability_fuzzer"
#endif // INPUTMETHOD_IMF_CHOOSEDIALOG_INPUTMETHODABILITY_FUZZER_H

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2022 Huawei Device Co., Ltd.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<fuzz_config>
<fuzztest>
<!-- maximum length of a test input -->
<max_len>1000</max_len>
<!-- maximum total time in seconds to run the fuzzer -->
<max_total_time>300</max_total_time>
<!-- memory usage limit in Mb -->
<rss_limit_mb>4096</rss_limit_mb>
</fuzztest>
</fuzz_config>

View File

@ -0,0 +1,62 @@
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/inputmethod/imf/inputmethod.gni")
#####################hydra-fuzz###################
import("//build/config/features.gni")
import("//build/ohos.gni")
import("//build/test.gni")
##############################fuzztest##########################################
ohos_fuzztest("InputMethodControllerFuzzTest") {
module_out_path = "inputmethod/inputmethod"
fuzz_config_file =
"//base/inputmethod/imf/test/fuzztest/inputmethodcontroller_fuzzer"
include_dirs = [
"//base/inputmethod/imf/services/include",
"//foundation/ability/ability_runtime/interfaces/inner_api/app_manager/include/appmgr",
"//foundation/ability/ability_runtime/services/abilitymgr/include",
]
cflags = [
"-g",
"-O0",
"-Wno-unused-variable",
"-fno-omit-frame-pointer",
]
sources = [ "inputmethodcontroller_fuzzer.cpp" ]
deps = [
"//base/inputmethod/imf/frameworks/inputmethod_controller:inputmethod_client",
"//base/inputmethod/imf/services:inputmethod_service",
"//foundation/ability/ability_runtime/services/abilitymgr:abilityms",
"//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core",
]
external_deps = [
"c_utils:utils",
"hiviewdfx_hilog_native:libhilog",
]
}
###############################################################################
group("fuzztest") {
testonly = true
deps = []
deps += [ ":InputMethodControllerFuzzTest" ]
}
###############################################################################

View File

@ -0,0 +1,14 @@
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
FUZZ

View File

@ -0,0 +1,189 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "inputmethodcontroller_fuzzer.h"
#include <cstddef>
#include <cstdint>
#include "global.h"
#include "input_method_controller.h"
#include "key_event.h"
#include "message_parcel.h"
using namespace OHOS::MiscServices;
namespace OHOS {
class TextListener : public OnTextChangedListener {
public:
TextListener() {}
~TextListener() {}
void InsertText(const std::u16string &text) {}
void DeleteBackward(int32_t length) {}
void SetKeyboardStatus(bool status) {}
void DeleteForward(int32_t length) {}
void SendKeyEventFromInputMethod(const KeyEvent &event) {}
void SendKeyboardInfo(const KeyboardInfo &status) {}
void MoveCursor(const Direction direction) {}
};
class SettingListener : public InputMethodSettingListener {
void OnImeChange(const Property &property, const SubProperty &subProperty) {}
};
void TestListInputMethod(sptr<InputMethodController> imc)
{
std::vector<Property> properties = {};
imc->ListInputMethod(properties);
imc->ListInputMethod(false, properties);
imc->ListInputMethod(true, properties);
imc->DisplayOptionalInputMethod();
}
void TestListInputMethodSubtype(sptr<InputMethodController> imc, const std::string &fuzzedString, int32_t fuzzedInt32)
{
std::vector<SubProperty> subProperties = {};
Property property;
property.name = fuzzedString;
property.id = fuzzedString;
property.label = fuzzedString;
property.icon = fuzzedString;
property.iconId = fuzzedInt32;
imc->ListInputMethodSubtype(property, subProperties);
}
void TestDispatchKeyEvent(sptr<InputMethodController> imc, int32_t fuzzedInt32)
{
sptr<OnTextChangedListener> textListener = new TextListener();
imc->Attach(textListener);
std::shared_ptr<MMI::KeyEvent> keyEvent = MMI::KeyEvent::Create();
keyEvent->SetKeyAction(fuzzedInt32);
keyEvent->SetKeyCode(fuzzedInt32);
imc->dispatchKeyEvent(keyEvent);
}
void TestOnSelectionChange(
sptr<InputMethodController> imc, std::u16string fuzzedU16String, int fuzzedInt, double fuzzedDouble)
{
sptr<OnTextChangedListener> textListener = new TextListener();
imc->Attach(textListener);
CursorInfo cursorInfo;
cursorInfo.height = fuzzedDouble;
cursorInfo.left = fuzzedDouble;
cursorInfo.top = fuzzedDouble;
cursorInfo.width = fuzzedDouble;
imc->OnCursorUpdate(cursorInfo);
imc->OnSelectionChange(fuzzedU16String, fuzzedInt, fuzzedInt);
}
void TestOnConfigurationChange(sptr<InputMethodController> imc)
{
sptr<OnTextChangedListener> textListener = new TextListener();
imc->Attach(textListener);
Configuration info;
EnterKeyType keyType = EnterKeyType::DONE;
info.SetEnterKeyType(keyType);
TextInputType textInputType = TextInputType::DATETIME;
info.SetTextInputType(textInputType);
imc->OnConfigurationChange(info);
int32_t enterKeyType;
int32_t inputPattern;
imc->GetEnterKeyType(enterKeyType);
imc->GetInputPattern(inputPattern);
}
void TestSwitchInputMethod(sptr<InputMethodController> imc, std::string fuzzedString)
{
imc->SwitchInputMethod(fuzzedString, fuzzedString);
imc->ShowOptionalInputMethod();
}
void TestSetCallingWindow(sptr<InputMethodController> imc, uint32_t fuzzedUInt32)
{
sptr<OnTextChangedListener> textListener = new TextListener();
imc->Attach(textListener);
imc->SetCallingWindow(fuzzedUInt32);
imc->ShowSoftKeyboard();
imc->HideSoftKeyboard();
}
void TestShowSomething(sptr<InputMethodController> imc)
{
sptr<OnTextChangedListener> textListener = new TextListener();
imc->Attach(textListener);
imc->ShowCurrentInput();
imc->HideCurrentInput();
imc->ShowTextInput();
imc->HideTextInput();
imc->GetCurrentInputMethod();
imc->GetCurrentInputMethodSubtype();
auto settingListener = std::make_shared<SettingListener>();
imc->setImeListener(settingListener);
imc->StopInputSession();
imc->Close();
}
void TestGetTextBeforeCursor(sptr<InputMethodController> imc, int32_t fuzzedInt32)
{
sptr<OnTextChangedListener> textListener = new TextListener();
imc->Attach(textListener);
std::u16string text;
imc->GetTextBeforeCursor(fuzzedInt32, text);
}
void TestTextAfterCursor(sptr<InputMethodController> imc, int32_t fuzzedInt32)
{
sptr<OnTextChangedListener> textListener = new TextListener();
imc->Attach(textListener);
std::u16string text;
imc->GetTextAfterCursor(fuzzedInt32, text);
}
} // namespace OHOS
/* Fuzzer entry point */
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
/* Run your code on data */
std::string fuzzedString(data, data + size);
std::u16string fuzzedU16String = u"insert text";
auto fuzzedInt = static_cast<int>(size);
auto fuzzedInt32 = static_cast<int32_t>(size);
auto fuzzedUInt32 = static_cast<uint32_t>(size);
auto fuzzedDouble = static_cast<double>(size);
OHOS::sptr<InputMethodController> imc = InputMethodController::GetInstance();
OHOS::TestListInputMethod(imc);
OHOS::TestListInputMethodSubtype(imc, fuzzedString, fuzzedInt32);
OHOS::TestOnSelectionChange(imc, fuzzedU16String, fuzzedInt, fuzzedDouble);
OHOS::TestOnConfigurationChange(imc);
OHOS::TestSwitchInputMethod(imc, fuzzedString);
OHOS::TestGetTextBeforeCursor(imc, fuzzedInt32);
OHOS::TestSetCallingWindow(imc, fuzzedUInt32);
OHOS::TestDispatchKeyEvent(imc, fuzzedInt32);
OHOS::TestShowSomething(imc);
return 0;
}

View File

@ -0,0 +1,21 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef TEST_FUZZTEST_INPUTMETHODCONTROLLER_FUZZER_INPUTMETHODCONTROLLER_FUZZER_H
#define TEST_FUZZTEST_INPUTMETHODCONTROLLER_FUZZER_INPUTMETHODCONTROLLER_FUZZER_H
#define FUZZ_PROJECT_NAME "inputmethodcontroller_fuzzer"
#endif // TEST_FUZZTEST_INPUTMETHODCONTROLLER_FUZZER_INPUTMETHODCONTROLLER_FUZZER_H

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2022 Huawei Device Co., Ltd.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<fuzz_config>
<fuzztest>
<!-- maximum length of a test input -->
<max_len>1000</max_len>
<!-- maximum total time in seconds to run the fuzzer -->
<max_total_time>300</max_total_time>
<!-- memory usage limit in Mb -->
<rss_limit_mb>4096</rss_limit_mb>
</fuzztest>
</fuzz_config>

View File

@ -0,0 +1,70 @@
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/inputmethod/imf/inputmethod.gni")
#####################hydra-fuzz###################
import("//build/config/features.gni")
import("//build/ohos.gni")
import("//build/test.gni")
##############################fuzztest##########################################
ohos_fuzztest("InputMethodSettingFuzzTest") {
module_out_path = "inputmethod/inputmethod"
fuzz_config_file =
"//base/inputmethod/imf/test/fuzztest/inputmethodsetting_fuzzer"
include_dirs = [
"//base/inputmethod/imf/services/include",
"//foundation/ability/ability_runtime/interfaces/inner_api/app_manager/include/appmgr",
"//foundation/ability/ability_runtime/services/abilitymgr/include",
"//foundation/ability/ability_runtime/interfaces/inner_api/ability_manager/include/",
"//third_party/jsoncpp/include/",
"//foundation/bundlemanager/bundle_framework/interfaces/inner_api/appexecfwk_core/include/bundlemgr",
"//foundation/multimedia/image_framework/interfaces/innerkits/include",
]
cflags = [
"-g",
"-O0",
"-Wno-unused-variable",
"-fno-omit-frame-pointer",
]
sources = [ "inputmethodsetting_fuzzer.cpp" ]
deps = [
"${ability_runtime_services_path}/abilitymgr:abilityms",
"//base/inputmethod/imf/frameworks/inputmethod_controller:inputmethod_client",
"//base/inputmethod/imf/services:inputmethod_service",
"//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core",
]
external_deps = [
"bundle_framework:appexecfwk_core",
"c_utils:utils",
"hiviewdfx_hilog_native:libhilog",
]
}
###############################################################################
group("fuzztest") {
testonly = true
deps = []
deps += [
# deps file
":InputMethodSettingFuzzTest",
]
}
###############################################################################

View File

@ -0,0 +1,14 @@
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
FUZZ

View File

@ -0,0 +1,90 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "inputmethodsetting_fuzzer.h"
#include <cstddef>
#include <cstdint>
#include "peruser_session.h"
#include "peruser_setting.h"
#include "input_method_system_ability.h"
#include "input_method_setting.h"
#include "input_method_controller.h"
#include "global.h"
#include "message_parcel.h"
using namespace OHOS::MiscServices;
namespace OHOS {
class TextListener : public OnTextChangedListener {
public:
TextListener() {}
~TextListener() {}
void InsertText(const std::u16string& text) {}
void DeleteBackward(int32_t length) {}
void SetKeyboardStatus(bool status) {}
void DeleteForward(int32_t length) {}
void SendKeyEventFromInputMethod(const KeyEvent& event) {}
void SendKeyboardInfo(const KeyboardInfo& status) {}
void MoveCursor(const Direction direction) {}
};
bool FuzzInputMethodSetting(const uint8_t* rawData, size_t size)
{
sptr<InputMethodController> imc = InputMethodController::GetInstance();
sptr<OnTextChangedListener> textListener = new TextListener();
imc->Attach(textListener);
constexpr int32_t MAIN_USER_ID = 100;
PerUserSetting *setting = new (std::nothrow) PerUserSetting(MAIN_USER_ID);
if (setting == nullptr) {
return true;
}
InputMethodSetting *methodSetting = setting->GetInputMethodSetting();
if (methodSetting == nullptr) {
return true;
}
InputMethodSetting setting_ = *methodSetting;
std::u16string imeId = Str8ToStr16(std::string(rawData, rawData + size));
std::vector<int32_t> types;
for (size_t i = 0; i < size; ++i) {
types.push_back(static_cast<int32_t>(*rawData));
}
setting_.GetCurrentInputMethod();
setting_.SetCurrentInputMethod(imeId);
setting_.GetEnabledInputMethodList();
setting_.AddEnabledInputMethod(imeId, types);
setting_.RemoveEnabledInputMethod(imeId);
setting_.GetEnabledKeyboardTypes(imeId);
setting_.GetCurrentKeyboardType();
setting_.SetCurrentKeyboardType(static_cast<int32_t>(*rawData));
setting_.GetCurrentSysKeyboardType();
setting_.SetCurrentSysKeyboardType(static_cast<int32_t>(*rawData));
setting_.FindKey(imeId);
setting_.ClearData();
delete setting;
setting = nullptr;
return true;
}
}
/* Fuzzer entry point */
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
{
/* Run your code on data */
OHOS::FuzzInputMethodSetting(data, size);
return 0;
}

View File

@ -0,0 +1,21 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef TEST_FUZZTEST_INPUTMETHODSETTING_FUZZER_INPUTMETHODSETTING_FUZZER_H
#define TEST_FUZZTEST_INPUTMETHODSETTING_FUZZER_INPUTMETHODSETTING_FUZZER_H
#define FUZZ_PROJECT_NAME "inputmethodsetting_fuzzer"
#endif // TEST_FUZZTEST_INPUTMETHODSETTING_FUZZER_INPUTMETHODSETTING_FUZZER_H

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2022 Huawei Device Co., Ltd.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<fuzz_config>
<fuzztest>
<!-- maximum length of a test input -->
<max_len>1000</max_len>
<!-- maximum total time in seconds to run the fuzzer -->
<max_total_time>300</max_total_time>
<!-- memory usage limit in Mb -->
<rss_limit_mb>4096</rss_limit_mb>
</fuzztest>
</fuzz_config>

View File

@ -0,0 +1,73 @@
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/inputmethod/imf/inputmethod.gni")
#####################hydra-fuzz###################
import("//build/config/features.gni")
import("//build/ohos.gni")
import("//build/test.gni")
##############################fuzztest##########################################
ohos_fuzztest("PerUserSessionFuzzTest") {
module_out_path = "inputmethod/inputmethod"
fuzz_config_file =
"//base/inputmethod/imf/test/fuzztest/perusersession_fuzzer"
include_dirs = [
"//base/inputmethod/imf/services/include",
"//base/inputmethod/imf/frameworks/inputmethod_controller/include",
"//base/inputmethod/imf/services/include",
"//foundation/ability/ability_runtime/services/abilitymgr/include",
"//foundation/ability/ability_runtime/interfaces/inner_api/ability_manager/include",
"//third_party/jsoncpp/include",
"//foundation/ability/ability_runtime/interfaces/inner_api/app_manager/include/appmgr",
"//foundation/multimedia/image_framework/interfaces/innerkits/include",
]
cflags = [
"-g",
"-O0",
"-Wno-unused-variable",
"-fno-omit-frame-pointer",
]
sources = [ "perusersession_fuzzer.cpp" ]
deps = [
"//base/inputmethod/imf/frameworks/inputmethod_ability:inputmethod_ability",
"//base/inputmethod/imf/frameworks/inputmethod_controller:inputmethod_client",
"//base/inputmethod/imf/services:inputmethod_service",
"//foundation/ability/ability_runtime/services/abilitymgr:abilityms",
"//foundation/arkui/napi:ace_napi",
"//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core",
]
external_deps = [
"c_utils:utils",
"hiviewdfx_hilog_native:libhilog",
"ipc:ipc_core",
]
}
###############################################################################
group("fuzztest") {
testonly = true
deps = []
deps += [
# deps file
":PerUserSessionFuzzTest",
]
}
###############################################################################

View File

@ -0,0 +1,14 @@
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
FUZZ

View File

@ -0,0 +1,99 @@
/*
* Copyright (c) 2022-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "perusersession_fuzzer.h"
#include <cstddef>
#include <cstdint>
#include <memory>
#include <string_ex.h>
#include "global.h"
#include "i_input_method_agent.h"
#include "i_input_method_core.h"
#include "input_client_proxy.h"
#include "input_method_ability.h"
#include "input_method_agent_proxy.h"
#include "input_method_agent_stub.h"
#include "input_method_core_proxy.h"
#include "input_method_info.h"
#include "input_method_property.h"
#include "iremote_broker.h"
#include "message_parcel.h"
#include "peruser_session.h"
#include "peruser_setting.h"
using namespace OHOS::MiscServices;
namespace OHOS {
constexpr size_t THRESHOLD = 10;
uint32_t ConvertToUint32(const uint8_t *ptr)
{
if (ptr == nullptr) {
return 0;
}
uint32_t bigVar = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
return bigVar;
}
bool FuzzPerUserSession(const uint8_t *rawData, size_t size)
{
Property property;
SubProperty subProperty;
int flags = static_cast<int32_t>(*rawData);
std::string str(rawData, rawData + size);
std::u16string packageName = Str8ToStr16(str);
bool isShowKeyboard = true;
constexpr int32_t MAIN_USER_ID = 100;
sptr<IInputClient> client = new (std::nothrow) InputClientStub();
sptr<IRemoteObject> object = client->AsObject();
std::shared_ptr<PerUserSession> userSessions = std::make_shared<PerUserSession>(MAIN_USER_ID);
sptr<IInputMethodCore> core = new InputMethodCoreProxy(object);
sptr<IInputMethodAgent> agent = new InputMethodAgentProxy(object);
InputMethodInfo *ime = new InputMethodInfo();
userSessions->OnPackageRemoved(packageName);
userSessions->OnShowKeyboardSelf();
userSessions->OnInputMethodSwitched(property, subProperty);
userSessions->GetCurrentSubProperty();
userSessions->StartInputService();
userSessions->SetCurrentSubProperty(subProperty);
userSessions->StopInputService(str);
userSessions->JoinWorkThread();
userSessions->OnHideKeyboardSelf(flags);
userSessions->OnStartInput(client, isShowKeyboard);
userSessions->OnStopInput(client);
userSessions->OnReleaseInput(client);
userSessions->SetCurrentIme(ime);
userSessions->SetSecurityIme(ime);
userSessions->ResetIme(ime, ime);
userSessions->OnSetCoreAndAgent(core, agent);
delete ime;
ime = nullptr;
return true;
}
}
/* Fuzzer entry point */
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
{
if (size < OHOS::THRESHOLD) {
return 0;
}
/* Run your code on data */
OHOS::FuzzPerUserSession(data, size);
return 0;
}

View File

@ -0,0 +1,21 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef TEST_FUZZTEST_PERUSERSESSION_FUZZER_AGENTSTUB_FUZZER_H
#define TEST_FUZZTEST_PERUSERSESSION_FUZZER_AGENTSTUB_FUZZER_H
#define FUZZ_PROJECT_NAME "perusersession_fuzzer"
#endif // TEST_FUZZTEST_PERUSERSESSION_FUZZER_AGENTSTUB_FUZZER_H

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2022 Huawei Device Co., Ltd.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<fuzz_config>
<fuzztest>
<!-- maximum length of a test input -->
<max_len>1000</max_len>
<!-- maximum total time in seconds to run the fuzzer -->
<max_total_time>300</max_total_time>
<!-- memory usage limit in Mb -->
<rss_limit_mb>4096</rss_limit_mb>
</fuzztest>
</fuzz_config>

View File

@ -0,0 +1,73 @@
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//base/inputmethod/imf/inputmethod.gni")
#####################hydra-fuzz###################
import("//build/config/features.gni")
import("//build/ohos.gni")
import("//build/test.gni")
##############################fuzztest##########################################
ohos_fuzztest("PerUserSettingFuzzTest") {
module_out_path = "inputmethod/inputmethod"
fuzz_config_file =
"//base/inputmethod/imf/test/fuzztest/perusersetting_fuzzer"
include_dirs = [
"//base/inputmethod/imf/services/include",
"//base/inputmethod/imf/frameworks/inputmethod_controller/include",
"//base/inputmethod/imf/services/include",
"//foundation/ability/ability_runtime/services/abilitymgr/include",
"//foundation/ability/ability_runtime/interfaces/inner_api/ability_manager/include",
"//third_party/jsoncpp/include",
"//foundation/ability/ability_runtime/interfaces/inner_api/app_manager/include/appmgr",
"//foundation/multimedia/image_framework/interfaces/innerkits/include",
]
cflags = [
"-g",
"-O0",
"-Wno-unused-variable",
"-fno-omit-frame-pointer",
]
sources = [ "perusersetting_fuzzer.cpp" ]
deps = [
"//base/inputmethod/imf/frameworks/inputmethod_ability:inputmethod_ability",
"//base/inputmethod/imf/frameworks/inputmethod_controller:inputmethod_client",
"//base/inputmethod/imf/services:inputmethod_service",
"//foundation/ability/ability_runtime/services/abilitymgr:abilityms",
"//foundation/arkui/napi:ace_napi",
"//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core",
]
external_deps = [
"c_utils:utils",
"hiviewdfx_hilog_native:libhilog",
"ipc:ipc_core",
]
}
###############################################################################
group("fuzztest") {
testonly = true
deps = []
deps += [
# deps file
":PerUserSettingFuzzTest",
]
}
###############################################################################

View File

@ -0,0 +1,14 @@
# Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
FUZZ

View File

@ -0,0 +1,78 @@
/*
* Copyright (c) 2022-2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "perusersetting_fuzzer.h"
#include <cstddef>
#include <cstdint>
#include <memory>
#include <string_ex.h>
#include "global.h"
#include "input_method_agent_stub.h"
#include "input_method_info.h"
#include "message_parcel.h"
#include "peruser_setting.h"
using namespace OHOS::MiscServices;
namespace OHOS {
constexpr size_t THRESHOLD = 10;
uint32_t ConvertToUint32(const uint8_t *ptr)
{
if (ptr == nullptr) {
return 0;
}
uint32_t bigVar = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
return bigVar;
}
bool FuzzPerUserSetting(const uint8_t *rawData, size_t size)
{
std::string str(reinterpret_cast<const char *>(rawData), size);
std::u16string imeId = Str8ToStr16(str);
std::u16string packageName = Str8ToStr16(str);
std::u16string key = Str8ToStr16(str);
std::u16string value = Str8ToStr16(str);
bool isSecurityIme = true;
constexpr int32_t MAIN_USER_ID = 100;
std::shared_ptr<PerUserSetting> userSetting = std::make_shared<PerUserSetting>(MAIN_USER_ID);
userSetting->Initialize();
userSetting->GetUserState();
userSetting->GetCurrentInputMethod();
userSetting->GetSecurityInputMethod();
userSetting->GetNextInputMethod();
userSetting->GetInputMethodSetting();
userSetting->GetInputMethodProperty(imeId);
userSetting->OnPackageAdded(packageName, isSecurityIme);
userSetting->OnPackageRemoved(packageName, isSecurityIme);
userSetting->OnSettingChanged(key, value);
userSetting->OnAdvanceToNext();
userSetting->OnUserLocked();
return true;
}
}
/* Fuzzer entry point */
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
{
if (size < OHOS::THRESHOLD) {
return 0;
}
/* Run your code on data */
OHOS::FuzzPerUserSetting(data, size);
return 0;
}

View File

@ -0,0 +1,21 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef TEST_FUZZTEST_PERUSERSETTING_FUZZER_AGENTSTUB_FUZZER_H
#define TEST_FUZZTEST_PERUSERSETTING_FUZZER_AGENTSTUB_FUZZER_H
#define FUZZ_PROJECT_NAME "perusersetting_fuzzer"
#endif // TEST_FUZZTEST_PERUSERSETTING_FUZZER_AGENTSTUB_FUZZER_H

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2022 Huawei Device Co., Ltd.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<fuzz_config>
<fuzztest>
<!-- maximum length of a test input -->
<max_len>1000</max_len>
<!-- maximum total time in seconds to run the fuzzer -->
<max_total_time>300</max_total_time>
<!-- memory usage limit in Mb -->
<rss_limit_mb>4096</rss_limit_mb>
</fuzztest>
</fuzz_config>

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021 Huawei Device Co., Ltd. # Copyright (c) 2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
# You may obtain a copy of the License at # You may obtain a copy of the License at

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021 Huawei Device Co., Ltd. * Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at

Some files were not shown because too many files have changed in this diff Show More