!41 修改输入法为service方式

Merge pull request !41 from demon/master
This commit is contained in:
openharmony_ci
2022-01-25 12:49:26 +00:00
committed by Gitee
6 changed files with 48 additions and 72 deletions
@@ -36,7 +36,6 @@ namespace MiscServices {
INITIALIZE_INPUT = FIRST_CALL_TRANSACTION,
START_INPUT,
STOP_INPUT,
DISPATCH_KEY,
SHOW_KEYBOARD,
HIDE_KEYBOARD,
SET_KEYBOARD_TYPE,
@@ -359,9 +359,9 @@ using namespace MessageID;
}
MessageParcel data;
if (!(data.WriteInterfaceToken(mImms->GetDescriptor())
&&data.WriteRemoteObject(mClient->AsObject().GetRefPtr())
&&data.WriteInt32(keyEvent->GetKeyCode())
&&data.WriteInt32(keyEvent->GetKeyAction()))) {
&& data.WriteRemoteObject(mClient->AsObject().GetRefPtr())
&& data.WriteInt32(keyEvent->GetKeyCode())
&& data.WriteInt32(keyEvent->GetKeyAction()))) {
return false;
}
mImms->DispatchKey(data);
@@ -70,11 +70,11 @@ namespace MiscServices {
void WorkThread();
PerUserSetting *GetUserSetting(int32_t userId);
PerUserSession *GetUserSession(int32_t userId);
void StartInputService();
int32_t OnUserStarted(const Message *msg);
int32_t OnUserStopped(const Message *msg);
int32_t OnUserUnlocked(const Message *msg);
int32_t OnUserLocked(const Message *msg);
int32_t OnPrepareInput(Message *msg);
int32_t OnHandleMessage(Message *msg);
int32_t OnRemotePeerDied(const Message *msg);
int32_t OnSettingChanged(const Message *msg);
+1 -1
View File
@@ -114,7 +114,7 @@ namespace MiscServices {
void CreateWorkThread(MessageHandler& handler);
void JoinWorkThread();
void SetInputMethodAbility(sptr<InputMethodAbility> &inputMethodAbility);
static void BindInputAbility();
static bool StartInputService();
private:
int userId_; // the id of the user to whom the object is linking
int userState; // the state of the user to whom the object is linking
+24 -42
View File
@@ -96,7 +96,7 @@ namespace MiscServices {
void InputMethodSystemAbility::OnStart()
{
IMSA_HILOGI("Enter OnStart.");
IMSA_HILOGI("InputMethodSystemAbility::OnStart.");
if (state_ == ServiceRunningState::STATE_RUNNING) {
IMSA_HILOGI("ImsaService is already running.");
return;
@@ -123,6 +123,7 @@ namespace MiscServices {
}
IMSA_HILOGI("Publish ErrorCode::NO_ERROR.");
state_ = ServiceRunningState::STATE_RUNNING;
StartInputService();
return ErrorCode::NO_ERROR;
}
@@ -169,6 +170,27 @@ namespace MiscServices {
setting->Initialize();
}
void InputMethodSystemAbility::StartInputService() {
PerUserSession *session = GetUserSession(0);
std::map<int32_t, MessageHandler*>::const_iterator it = msgHandlers.find(0);
if (it == msgHandlers.end()) {
IMSA_HILOGE("InputMethodSystemAbility::StartInputService() need start handler");
MessageHandler *handler = new MessageHandler();
if (session == nullptr) {
IMSA_HILOGE("InputMethodSystemAbility::OnPrepareInput session is nullptr");
}
session->CreateWorkThread(*handler);
msgHandlers.insert(std::pair<int32_t, MessageHandler*>(0, handler));
}
if (!session->StartInputService()) {
IMSA_HILOGE("StartInputService failed. Try again 10s later");
auto callback = [=]() { StartInputService(); };
serviceHandler_->PostTask(callback, INIT_INTERVAL);
}
}
/*! Get the state of user
\n This API is added for unit test.
\param userID the id of given user
@@ -406,10 +428,7 @@ namespace MiscServices {
OnSettingChanged(msg);
break;
}
case MSG_ID_PREPARE_INPUT: {
OnPrepareInput(msg);
break;
}
case MSG_ID_PREPARE_INPUT:
case MSG_ID_RELEASE_INPUT:
case MSG_ID_START_INPUT:
case MSG_ID_STOP_INPUT:
@@ -600,43 +619,6 @@ namespace MiscServices {
return ErrorCode::NO_ERROR;
}
/*! Prepare input. Called by an input client.
\n Run in work thread of input method management service
\param msg the parameters from remote client are saved in msg->msgContent_
\return ErrorCode::NO_ERROR
\return ErrorCode::ERROR_USER_NOT_UNLOCKED user not unlocked
*/
int32_t InputMethodSystemAbility::OnPrepareInput(Message *msg)
{
IMSA_HILOGI("InputMethodSystemAbility::OnPrepareInput");
MessageParcel *data = msg->msgContent_;
int32_t userId = data->ReadInt32();
PerUserSetting *setting = GetUserSetting(userId);
if (setting == nullptr || setting->GetUserState() != UserState::USER_STATE_UNLOCKED) {
IMSA_HILOGE("InputMethodSystemAbility::OnPrepareInput errorCode = ErrorCode::ERROR_USER_NOT_UNLOCKED");
return ErrorCode::ERROR_USER_NOT_UNLOCKED;
}
std::map<int32_t, MessageHandler*>::const_iterator it = msgHandlers.find(userId);
if (it == msgHandlers.end()) {
PerUserSession *session = GetUserSession(userId);
MessageHandler *handler = new MessageHandler();
if (session == nullptr) {
IMSA_HILOGE("InputMethodSystemAbility::OnPrepareInput session is nullptr");
}
session->CreateWorkThread(*handler);
msgHandlers.insert(std::pair<int32_t, MessageHandler*>(userId, handler));
it = msgHandlers.find(userId);
}
if (it != msgHandlers.end()) {
MessageHandler *handler = it->second;
handler->SendMessage(msg);
}
return 0;
}
/*! Handle message
\param msgId the id of message to run
\msg the parameters are saved in msg->msgContent_
+19 -24
View File
@@ -494,7 +494,10 @@ namespace MiscServices {
lastImeIndex = index;
bool supportPhysicalKbd = Platform::Instance()->CheckPhysicalKeyboard();
localControlChannel[index]->ResetFlag();
if (imsCore[index] == nullptr) {
IMSA_HILOGE("PerUserSession::ShowKeyboard Aborted! imsCore[%{public}d] is nullptr", index);
return ErrorCode::ERROR_NULL_POINTER;
}
bool ret = imsCore[index]->startInput(clientInfo->channel, clientInfo->attribute, supportPhysicalKbd);
if (!ret ||
localControlChannel[index]->GetAgentAndChannel(&imsAgent, &imsChannel) == false) {
@@ -578,7 +581,6 @@ namespace MiscServices {
}
currentClient = nullptr;
imsAgent = nullptr;
imsCore[index] = nullptr;
if (imsChannel != nullptr) {
delete imsChannel;
imsChannel = nullptr;
@@ -999,7 +1001,7 @@ namespace MiscServices {
time_t now = time(0);
double diffSeconds = difftime(now, past[imeIndex]);
//time difference is more than 5 minutes, reset time and error num;
// time difference is more than 5 minutes, reset time and error num;
if (diffSeconds > COMMON_COUNT_THREE_HUNDRED) {
past[imeIndex] = now;
errorNum[imeIndex] = 1;
@@ -1178,18 +1180,22 @@ namespace MiscServices {
return (ClientInfo*) it->second;
}
void PerUserSession::BindInputAbility()
bool PerUserSession::StartInputService()
{
IMSA_HILOGE("PerUserSession::BindInputAbility");
IMSA_HILOGE("PerUserSession::StartInputService");
sptr<AAFwk::IAbilityManager> ams = GetAbilityManagerService();
if (ams == nullptr) {
return false;
}
AAFwk::Want want;
want.SetAction("action.system.inputmethod");
want.SetElementName("com.example.kikakeyboard", "com.example.kikakeyboard.MainAbility");
sptr<InputMethodAbilityConnectionStub> stub(new (std::nothrow) InputMethodAbilityConnectionStub(0));
sptr<AAFwk::AbilityConnectionProxy> connCallback = new (std::nothrow) AAFwk::AbilityConnectionProxy(stub);
std::shared_ptr<AAFwk::AbilityStartSetting> setting = AAFwk::AbilityStartSetting::GetEmptySetting();
setting->AddProperty(AAFwk::AbilityStartSetting::WINDOW_MODE_KEY,
std::to_string(AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_FLOATING));
GetAbilityManagerService()->StartAbility(want, *setting, nullptr, -1);
want.SetElementName("com.example.kikakeyboard", "com.example.kikakeyboard.ServiceExtAbility");
int32_t result = ams->StartAbility(want);
if (result != 0) {
IMSA_HILOGE("PerUserSession::StartInputService fail. result = %{public}d", result);
return false;
}
return true;
}
sptr<AAFwk::IAbilityManager> PerUserSession::GetAbilityManagerService()
@@ -1241,9 +1247,7 @@ namespace MiscServices {
int index = GetImeIndex(client);
IMSA_HILOGI("PerUserSession::OnPrepareInput index = %{public}d", index);
currentIndex = index;
IMSA_HILOGI("PerUserSession::OnPrepareInput BindInputAbility start");
BindInputAbility();
IMSA_HILOGI("PerUserSession::OnPrepareInput BindInputAbility end");
ShowKeyboard(client);
currentClient = client;
}
@@ -1311,15 +1315,6 @@ namespace MiscServices {
} else {
IMSA_HILOGI("PerUserSession::onSetInputMethodCore End...[%{public}d]\n", userId_);
}
if (currentClient != nullptr) {
usleep(SLEEP_TIME);
ret = ShowKeyboard(currentClient);
if (ret != ErrorCode::NO_ERROR) {
IMSA_HILOGE("PerUserSession::OnStartInput Aborted! %{public}s", ErrorCode::ToString(ret));
} else {
IMSA_HILOGI("PerUserSession::OnStartInput End...[%{public}d]\n", userId_);
}
}
IMSA_HILOGI("PerUserSession::OnStartInput End. currentClient is nullptr");
}