From 9e9b9aad05dd51ef84336b2f96a111f834285ff4 Mon Sep 17 00:00:00 2001 From: cy7717 Date: Sat, 30 Aug 2025 10:46:45 +0800 Subject: [PATCH] mod for bundle cache in sys language change Signed-off-by: cy7717 --- common/include/inputmethod_message_handler.h | 1 + etc/init/inputmethodservice.cfg | 3 +- services/include/full_ime_info_manager.h | 2 +- services/include/im_common_event_manager.h | 1 + services/src/im_common_event_manager.cpp | 89 +++++++++++-------- services/src/input_method_system_ability.cpp | 3 +- .../src/input_method_private_member_test.cpp | 31 +++++++ 7 files changed, 91 insertions(+), 39 deletions(-) diff --git a/common/include/inputmethod_message_handler.h b/common/include/inputmethod_message_handler.h index 7852a75bf..fea6b80f8 100644 --- a/common/include/inputmethod_message_handler.h +++ b/common/include/inputmethod_message_handler.h @@ -76,6 +76,7 @@ enum { MSG_ID_SET_COREANDANGENT, MSG_ID_UPDATE_LARGE_MEMORY_STATE, + MSG_ID_BUNDLE_RESOURCES_CHANGED, }; } diff --git a/etc/init/inputmethodservice.cfg b/etc/init/inputmethodservice.cfg index 7c117c5b3..8c994f940 100644 --- a/etc/init/inputmethodservice.cfg +++ b/etc/init/inputmethodservice.cfg @@ -22,7 +22,8 @@ "ohos.permission.RECEIVER_STARTUP_COMPLETED", "ohos.permission.GET_RUNNING_INFO", "ohos.permission.MANAGE_SETTINGS", - "ohos.permission.MANAGE_SECURE_SETTINGS" + "ohos.permission.MANAGE_SECURE_SETTINGS", + "ohos.permission.GET_BUNDLE_RESOURCES" ], "permission_acls" : ["ohos.permission.INPUT_MONITORING"], "caps" : [], diff --git a/services/include/full_ime_info_manager.h b/services/include/full_ime_info_manager.h index 211231d6b..22f426ce0 100644 --- a/services/include/full_ime_info_manager.h +++ b/services/include/full_ime_info_manager.h @@ -28,7 +28,7 @@ public: int32_t RegularInit(); int32_t Init(); // regular Init/boot complete/data share ready int32_t Switch(int32_t userId); // user switched - int32_t Update(); // language change + int32_t Update(); // sys language change/bundle res changed int32_t Delete(int32_t userId); // user removed int32_t Add(int32_t userId, const std::string &bundleName); // package added int32_t Delete(int32_t userId, const std::string &bundleName); // package removed diff --git a/services/include/im_common_event_manager.h b/services/include/im_common_event_manager.h index 5b52e5996..c1a24607d 100644 --- a/services/include/im_common_event_manager.h +++ b/services/include/im_common_event_manager.h @@ -55,6 +55,7 @@ public: void OnScreenUnlock(const EventFwk::CommonEventData &data); void OnScreenLock(const EventFwk::CommonEventData &data); void HandleLargeMemoryStateUpdate(const EventFwk::CommonEventData &data); + void OnBundleResChanged(const EventFwk::CommonEventData &data); private: using EventListenerFunc = std::function; diff --git a/services/src/im_common_event_manager.cpp b/services/src/im_common_event_manager.cpp index b6053d3ac..366e8a850 100644 --- a/services/src/im_common_event_manager.cpp +++ b/services/src/im_common_event_manager.cpp @@ -33,6 +33,7 @@ constexpr const char *COMMON_EVENT_INPUT_PANEL_STATUS_CHANGED = "usual.event.imf constexpr const char *COMMON_EVENT_PARAM_USER_ID = "userId"; constexpr const char *COMMON_EVENT_PARAM_PANEL_STATE = "panelState"; constexpr const char *COMMON_EVENT_PARAM_PANEL_RECT = "panelRect"; +constexpr const char *COMMON_EVENT_PARAM_BUNDLE_RES_CHANGE_TYPE = "bundleResourceChangeType"; constexpr const char *EVENT_LARGE_MEMORY_STATUS_CHANGED = "usual.event.memmgr.large_memory_status_changed"; constexpr const char *EVENT_MEMORY_STATE = "memory_state"; constexpr const char *EVENT_PARAM_UID = "uid"; @@ -71,6 +72,7 @@ bool ImCommonEventManager::SubscribeEvent() matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_SCREEN_UNLOCKED); matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_SCREEN_LOCKED); matchingSkills.AddEvent(EVENT_LARGE_MEMORY_STATUS_CHANGED); + matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_BUNDLE_RESOURCES_CHANGED); EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills); @@ -151,53 +153,68 @@ ImCommonEventManager::EventSubscriber::EventSubscriber(const EventFwk::CommonEve : EventFwk::CommonEventSubscriber(subscribeInfo) { EventManagerFunc_[CommonEventSupport::COMMON_EVENT_USER_SWITCHED] = - [] (EventSubscriber *that, const EventFwk::CommonEventData &data) { - return that->StartUser(data); - }; + [](EventSubscriber *that, const CommonEventData &data) { return that->StartUser(data); }; EventManagerFunc_[CommonEventSupport::COMMON_EVENT_USER_STOPPED] = - [] (EventSubscriber *that, const EventFwk::CommonEventData &data) { - return that->StopUser(data); - }; + [](EventSubscriber *that, const CommonEventData &data) { return that->StopUser(data); }; EventManagerFunc_[CommonEventSupport::COMMON_EVENT_USER_REMOVED] = - [] (EventSubscriber *that, const EventFwk::CommonEventData &data) { - return that->RemoveUser(data); - }; + [](EventSubscriber *that, const CommonEventData &data) { return that->RemoveUser(data); }; EventManagerFunc_[CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED] = - [] (EventSubscriber *that, const EventFwk::CommonEventData &data) { - return that->RemovePackage(data); - }; + [](EventSubscriber *that, const CommonEventData &data) { return that->RemovePackage(data); }; EventManagerFunc_[CommonEventSupport::COMMON_EVENT_BUNDLE_SCAN_FINISHED] = - [] (EventSubscriber *that, const EventFwk::CommonEventData &data) { - return that->OnBundleScanFinished(data); - }; + [](EventSubscriber *that, const CommonEventData &data) { return that->OnBundleScanFinished(data); }; EventManagerFunc_[CommonEventSupport::COMMON_EVENT_DATA_SHARE_READY] = - [] (EventSubscriber *that, const EventFwk::CommonEventData &data) { - return that->OnDataShareReady(data); - }; + [](EventSubscriber *that, const CommonEventData &data) { return that->OnDataShareReady(data); }; EventManagerFunc_[CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED] = - [] (EventSubscriber *that, const EventFwk::CommonEventData &data) { - return that->AddPackage(data); - }; + [](EventSubscriber *that, const CommonEventData &data) { return that->AddPackage(data); }; EventManagerFunc_[CommonEventSupport::COMMON_EVENT_PACKAGE_CHANGED] = - [] (EventSubscriber *that, const EventFwk::CommonEventData &data) { - return that->ChangePackage(data); - }; + [](EventSubscriber *that, const CommonEventData &data) { return that->ChangePackage(data); }; EventManagerFunc_[CommonEventSupport::COMMON_EVENT_BOOT_COMPLETED] = - [] (EventSubscriber *that, const EventFwk::CommonEventData &data) { - return that->HandleBootCompleted(data); - }; + [](EventSubscriber *that, const CommonEventData &data) { return that->HandleBootCompleted(data); }; EventManagerFunc_[CommonEventSupport::COMMON_EVENT_SCREEN_UNLOCKED] = - [] (EventSubscriber *that, const EventFwk::CommonEventData &data) { - return that->OnScreenUnlock(data); - }; + [](EventSubscriber *that, const CommonEventData &data) { return that->OnScreenUnlock(data); }; EventManagerFunc_[CommonEventSupport::COMMON_EVENT_SCREEN_LOCKED] = - [] (EventSubscriber *that, const EventFwk::CommonEventData &data) { - return that->OnScreenLock(data); - }; + [](EventSubscriber *that, const CommonEventData &data) { return that->OnScreenLock(data); }; + EventManagerFunc_[CommonEventSupport::COMMON_EVENT_BUNDLE_RESOURCES_CHANGED] = + [](EventSubscriber *that, const CommonEventData &data) { return that->OnBundleResChanged(data); }; EventManagerFunc_[EVENT_LARGE_MEMORY_STATUS_CHANGED] = - [] (EventSubscriber *that, const EventFwk::CommonEventData &data) { - return that->HandleLargeMemoryStateUpdate(data); - }; + [](EventSubscriber *that, const CommonEventData &data) { return that->HandleLargeMemoryStateUpdate(data); }; +} + +void ImCommonEventManager::EventSubscriber::OnBundleResChanged(const CommonEventData &data) +{ + auto const &want = data.GetWant(); + auto userId = want.GetIntParam(COMMON_EVENT_PARAM_USER_ID, OsAccountAdapter::INVALID_USER_ID); + if (userId == OsAccountAdapter::INVALID_USER_ID) { + IMSA_HILOGE("invalid user id."); + return; + } + // -1 represent invalid bundleResChangeType + auto resChangeType = want.GetIntParam(COMMON_EVENT_PARAM_BUNDLE_RES_CHANGE_TYPE, -1); + IMSA_HILOGD("%{public}d/%{public}d bundle res changed!", userId, resChangeType); + MessageParcel *parcel = new (std::nothrow) MessageParcel(); + if (parcel == nullptr) { + IMSA_HILOGE("Parcel is nullptr!"); + return; + } + if (!ITypesUtil::Marshal(*parcel, userId, resChangeType)) { + IMSA_HILOGE("Failed to write message parcel."); + delete parcel; + return; + } + Message *msg = new (std::nothrow) Message(MessageID::MSG_ID_BUNDLE_RESOURCES_CHANGED, parcel); + if (msg == nullptr) { + IMSA_HILOGE("Failed to create Message!"); + delete parcel; + return; + } + MessageHandler *msgHandle = MessageHandler::Instance(); + if (msgHandle == nullptr) { + IMSA_HILOGE("MessageHandler is nullptr!"); + delete parcel; + delete msg; + return; + } + msgHandle->SendMessage(msg); } void ImCommonEventManager::EventSubscriber::OnReceiveEvent(const EventFwk::CommonEventData &data) diff --git a/services/src/input_method_system_ability.cpp b/services/src/input_method_system_ability.cpp index 42e57dcd6..a611591e2 100644 --- a/services/src/input_method_system_ability.cpp +++ b/services/src/input_method_system_ability.cpp @@ -1644,7 +1644,8 @@ void InputMethodSystemAbility::WorkThread() HandlePackageEvent(msg); break; } - case MSG_ID_SYS_LANGUAGE_CHANGED: { + case MSG_ID_SYS_LANGUAGE_CHANGED: + case MSG_ID_BUNDLE_RESOURCES_CHANGED: { FullImeInfoManager::GetInstance().Update(); break; } diff --git a/test/unittest/cpp_test/src/input_method_private_member_test.cpp b/test/unittest/cpp_test/src/input_method_private_member_test.cpp index fd7bf636f..b45736e1c 100644 --- a/test/unittest/cpp_test/src/input_method_private_member_test.cpp +++ b/test/unittest/cpp_test/src/input_method_private_member_test.cpp @@ -28,6 +28,7 @@ #include "user_session_manager.h" #include "system_param_adapter.h" #include "ime_state_manager_factory.h" +#include "inputmethod_message_handler.h" #undef private #include #include @@ -82,6 +83,8 @@ constexpr int32_t MS_TO_US = 1000; constexpr int32_t WAIT_FOR_THREAD_SCHEDULE = 10; constexpr int32_t WAIT_ATTACH_FINISH_DELAY = 50; constexpr uint32_t MAX_ATTACH_COUNT = 100000; +constexpr const char *COMMON_EVENT_PARAM_USER_ID = "userId"; +constexpr const char *COMMON_EVENT_PARAM_BUNDLE_RES_CHANGE_TYPE = "bundleResourceChangeType"; std::atomic InputMethodPrivateMemberTest::tryLockFailCount_ = 0; std::shared_ptr InputMethodPrivateMemberTest::session_ = nullptr; void InputMethodPrivateMemberTest::TestImfStartIme() @@ -3025,5 +3028,33 @@ HWTEST_F(InputMethodPrivateMemberTest, PerUserSession_GetFinalCallingWindowInfo, ImfCallingWindowInfo windowInfo = userSession->GetFinalCallingWindowInfo(clientInfo); EXPECT_TRUE(windowInfo.displayId == DisplayAdapter::GetDefaultDisplayId()); } + +/** + * @tc.name: ImCommonEventManager_OnBundleResChanged + * @tc.desc: ImCommonEventManager_OnBundleResChanged + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(InputMethodPrivateMemberTest, ImCommonEventManager_OnBundleResChanged, TestSize.Level0) +{ + IMSA_HILOGI("InputMethodPrivateMemberTest::ImCommonEventManager_OnBundleResChanged start."); + EventFwk::MatchingSkills matchingSkills; + EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills); + auto subscriber = std::make_shared(subscriberInfo); + auto msgHandler = MessageHandler::Instance(); + ASSERT_NE(msgHandler, nullptr); + while (!msgHandler->mQueue.empty()) { + msgHandler->mQueue.pop(); + } + AAFwk::Want want; + int32_t type = 3; + // -1 represent invalid userId + want.SetParam(COMMON_EVENT_PARAM_USER_ID, -1); + want.SetParam(COMMON_EVENT_PARAM_BUNDLE_RES_CHANGE_TYPE, type); + EventFwk::CommonEventData data; + data.SetWant(want); + subscriber->OnBundleResChanged(data); + EXPECT_TRUE(msgHandler->mQueue.empty()); +} } // namespace MiscServices } // namespace OHOS \ No newline at end of file -- Gitee