1 /*
2 * Copyright (c) 2025 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
16 #include <mutex>
17 #include "hidden_start_observer_manager.h"
18 #include "hilog_tag_wrapper.h"
19 #include "hitrace_meter.h"
20 #include "hidden_start_observer_stub.h"
21
22 namespace OHOS {
23 namespace AAFwk {
HiddenStartObserverManager()24 HiddenStartObserverManager::HiddenStartObserverManager()
25 {
26 TAG_LOGD(AAFwkTag::ABILITYMGR, "HiddenStartObserverManager instance is created");
27 }
28
~HiddenStartObserverManager()29 HiddenStartObserverManager::~HiddenStartObserverManager()
30 {
31 TAG_LOGD(AAFwkTag::ABILITYMGR, "HiddenStartObserverManager instance is destroyed");
32 }
33
GetInstance()34 HiddenStartObserverManager &HiddenStartObserverManager::GetInstance()
35 {
36 static HiddenStartObserverManager manager_;
37 return manager_;
38 }
39
RegisterObserver(const sptr<IHiddenStartObserver> & observer)40 int32_t HiddenStartObserverManager::RegisterObserver(const sptr<IHiddenStartObserver> &observer)
41 {
42 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
43 TAG_LOGD(AAFwkTag::ABILITYMGR, "RegisterObserver called");
44 if (observer == nullptr) {
45 TAG_LOGE(AAFwkTag::ABILITYMGR, "null observer");
46 return ERR_INVALID_VALUE;
47 }
48 if (ObserverExist(observer)) {
49 TAG_LOGE(AAFwkTag::ABILITYMGR, "observer exist");
50 return ERR_INVALID_VALUE;
51 }
52 std::lock_guard<ffrt::mutex> lockRegister(observerLock_);
53 observers_.emplace(observer);
54 TAG_LOGD(AAFwkTag::ABILITYMGR, "hidden start observers_ size:%{public}zu", observers_.size());
55 AddObserverDeathRecipient(observer);
56 return ERR_OK;
57 }
58
UnregisterObserver(const sptr<IHiddenStartObserver> & observer)59 int32_t HiddenStartObserverManager::UnregisterObserver(const sptr<IHiddenStartObserver> &observer)
60 {
61 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
62 TAG_LOGD(AAFwkTag::ABILITYMGR, "UnregisterObserver called");
63 if (observer == nullptr) {
64 TAG_LOGE(AAFwkTag::ABILITYMGR, "null observer");
65 return ERR_INVALID_VALUE;
66 }
67 std::lock_guard<ffrt::mutex> lockUnregister(observerLock_);
68 auto it = observers_.begin();
69 for (;it != observers_.end(); ++it) {
70 if ((*it)->AsObject() == observer->AsObject()) {
71 observers_.erase(it);
72 TAG_LOGD(AAFwkTag::ABILITYMGR, "hidden start observers_ size:%{public}zu", observers_.size());
73 RemoveObserverDeathRecipient(observer);
74 return ERR_OK;
75 }
76 }
77 TAG_LOGE(AAFwkTag::ABILITYMGR, "observer not exist");
78 return ERR_INVALID_VALUE;
79 }
80
ObserverExist(const sptr<IRemoteBroker> & observer)81 bool HiddenStartObserverManager::ObserverExist(const sptr<IRemoteBroker> &observer)
82 {
83 if (observer == nullptr) {
84 TAG_LOGE(AAFwkTag::ABILITYMGR, "null observer");
85 return false;
86 }
87 std::lock_guard<ffrt::mutex> lockRegister(observerLock_);
88 for (auto it = observers_.begin(); it != observers_.end(); ++it) {
89 if ((*it)->AsObject() == observer->AsObject()) {
90 return true;
91 }
92 }
93 return false;
94 }
95
IsHiddenStart(int32_t uid)96 bool HiddenStartObserverManager::IsHiddenStart(int32_t uid)
97 {
98 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
99 auto observersCopy = GetObserversCopy();
100 TAG_LOGE(AAFwkTag::ABILITYMGR, "Need query %{public}zu observers.", observersCopy.size());
101 for (auto it = observersCopy.begin(); it != observersCopy.end(); ++it) {
102 if (*it == nullptr) {
103 continue;
104 }
105 if ((*it)->IsHiddenStart(uid)) {
106 return true;
107 }
108 }
109 return false;
110 }
111
AddObserverDeathRecipient(const sptr<IRemoteBroker> & observer)112 void HiddenStartObserverManager::AddObserverDeathRecipient(const sptr<IRemoteBroker> &observer)
113 {
114 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
115 TAG_LOGD(AAFwkTag::ABILITYMGR, "Add observer death recipient begin.");
116 if (observer == nullptr || observer->AsObject() == nullptr) {
117 TAG_LOGE(AAFwkTag::ABILITYMGR, "null observer");
118 return;
119 }
120 std::lock_guard lock(recipientMapMutex_);
121 auto it = recipientMap_.find(observer->AsObject());
122 if (it != recipientMap_.end()) {
123 TAG_LOGE(AAFwkTag::ABILITYMGR, "Death recipient added");
124 return;
125 }
126 sptr<IRemoteObject::DeathRecipient> deathRecipient = nullptr;
127 auto deathRecipientFunc = [](const wptr<IRemoteObject> &remote) {
128 HiddenStartObserverManager::GetInstance().OnObserverDied(remote);
129 };
130 deathRecipient = new (std::nothrow) HiddenStartObserverRecipient(deathRecipientFunc);
131 if (deathRecipient == nullptr) {
132 TAG_LOGE(AAFwkTag::ABILITYMGR, "null deathRecipient");
133 return;
134 }
135 if (!observer->AsObject()->AddDeathRecipient(deathRecipient)) {
136 TAG_LOGE(AAFwkTag::ABILITYMGR, "AddDeathRecipient failed");
137 }
138 recipientMap_.emplace(observer->AsObject(), deathRecipient);
139 }
140
RemoveObserverDeathRecipient(const sptr<IRemoteBroker> & observer)141 void HiddenStartObserverManager::RemoveObserverDeathRecipient(const sptr<IRemoteBroker> &observer)
142 {
143 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
144 TAG_LOGD(AAFwkTag::ABILITYMGR, "Remove observer death recipient begin.");
145 if (observer == nullptr || observer->AsObject() == nullptr) {
146 TAG_LOGE(AAFwkTag::ABILITYMGR, "null observer");
147 return;
148 }
149 std::lock_guard lock(recipientMapMutex_);
150 auto it = recipientMap_.find(observer->AsObject());
151 if (it != recipientMap_.end()) {
152 it->first->RemoveDeathRecipient(it->second);
153 recipientMap_.erase(it);
154 return;
155 }
156 }
157
OnObserverDied(const wptr<IRemoteObject> & remote)158 void HiddenStartObserverManager::OnObserverDied(const wptr<IRemoteObject> &remote)
159 {
160 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
161 TAG_LOGD(AAFwkTag::ABILITYMGR, "OnObserverDied");
162 auto object = remote.promote();
163 if (object == nullptr) {
164 TAG_LOGE(AAFwkTag::ABILITYMGR, "null observer");
165 return;
166 }
167
168 sptr<IHiddenStartObserver> observer = iface_cast<IHiddenStartObserver>(object);
169 UnregisterObserver(observer);
170 }
171
GetObserversCopy()172 HiddenStartObserverSet HiddenStartObserverManager::GetObserversCopy()
173 {
174 std::lock_guard<ffrt::mutex> lock(observerLock_);
175 return observers_;
176 }
177
HiddenStartObserverRecipient(RemoteDiedHandler handler)178 HiddenStartObserverRecipient::HiddenStartObserverRecipient(RemoteDiedHandler handler) : handler_(handler)
179 {}
180
~HiddenStartObserverRecipient()181 HiddenStartObserverRecipient::~HiddenStartObserverRecipient()
182 {}
183
OnRemoteDied(const wptr<IRemoteObject> & remote)184 void HiddenStartObserverRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
185 {
186 if (handler_) {
187 handler_(remote);
188 }
189 }
190 } // namespace AAFwk
191 } // namespace OHOS