1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #include "adapter/ohos/capability/package/package_event_proxy_ohos.h" 16 17 #include "common_event_manager.h" 18 #include "common_event_support.h" 19 20 #include "frameworks/core/common/container.h" 21 #include "frameworks/core/common/container_scope.h" 22 23 namespace OHOS::Ace { 24 std::unique_ptr<PackageEventProxy> PackageEventProxy::instance_; 25 std::mutex PackageEventProxy::mutex_; 26 GetInstance()27PackageEventProxy* PackageEventProxy::GetInstance() 28 { 29 if (!instance_) { 30 std::scoped_lock lock(mutex_); 31 if (!instance_) { 32 instance_ = std::make_unique<PackageEventProxyOhos>(); 33 } 34 } 35 return instance_.get(); 36 } 37 38 using OHOS::EventFwk::CommonEventManager; 39 using OHOS::EventFwk::CommonEventSubscribeInfo; 40 using OHOS::EventFwk::CommonEventSupport; 41 using OHOS::EventFwk::MatchingSkills; 42 OnReceiveEvent(const CommonEventData &)43void PackageEventSubscriber::OnReceiveEvent(const CommonEventData& /* data */) 44 { 45 LOGI("Package Change Common Event Received"); 46 PackageEventProxy::GetInstance()->OnPackageChange(); 47 } 48 PackageEventProxyOhos()49PackageEventProxyOhos::PackageEventProxyOhos() 50 { 51 MatchingSkills matchingSkills; 52 matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_PACKAGE_CHANGED); 53 matchingSkills.AddEvent(CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED); 54 55 CommonEventSubscribeInfo subscribeInfo(matchingSkills); 56 subscribeInfo.SetThreadMode(CommonEventSubscribeInfo::ThreadMode::HANDLER); 57 58 packageEventSubscriber_ = std::make_shared<PackageEventSubscriber>(subscribeInfo); 59 } 60 ~PackageEventProxyOhos()61PackageEventProxyOhos::~PackageEventProxyOhos() 62 { 63 CommonEventManager::UnSubscribeCommonEvent(packageEventSubscriber_); 64 } 65 OnPackageChange()66void PackageEventProxyOhos::OnPackageChange() 67 { 68 auto it = listeners_.begin(); 69 while (it != listeners_.end()) { 70 auto listener = it->first.Upgrade(); 71 if (listener) { 72 ContainerScope scope(it->second); 73 listener->OnPackageChange(); 74 ++it; 75 } else { 76 it = listeners_.erase(it); 77 if (listeners_.empty()) { 78 CommonEventManager::UnSubscribeCommonEvent(packageEventSubscriber_); 79 } 80 } 81 } 82 } 83 Register(const WeakPtr<PackageChangeListener> & listener)84void PackageEventProxyOhos::Register(const WeakPtr<PackageChangeListener>& listener) 85 { 86 if (listeners_.empty()) { 87 CommonEventManager::SubscribeCommonEvent(packageEventSubscriber_); 88 } 89 listeners_.insert({ listener, Container::CurrentId() }); 90 } 91 } // namespace OHOS::Ace