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()27 PackageEventProxy* 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 &)43 void PackageEventSubscriber::OnReceiveEvent(const CommonEventData& /* data */)
44 {
45     LOGI("Package Change Common Event Received");
46     PackageEventProxy::GetInstance()->OnPackageChange();
47 }
48 
PackageEventProxyOhos()49 PackageEventProxyOhos::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()61 PackageEventProxyOhos::~PackageEventProxyOhos()
62 {
63     CommonEventManager::UnSubscribeCommonEvent(packageEventSubscriber_);
64 }
65 
OnPackageChange()66 void 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)84 void 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