• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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