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 "query_erms_observer_manager.h"
16
17 #include "ability_manager_service.h"
18 #include "ability_util.h"
19 #include "hilog_tag_wrapper.h"
20
21 namespace OHOS {
22 namespace AAFwk {
QueryERMSObserverManager()23 QueryERMSObserverManager::QueryERMSObserverManager()
24 {}
25
~QueryERMSObserverManager()26 QueryERMSObserverManager::~QueryERMSObserverManager()
27 {}
28
GetInstance()29 QueryERMSObserverManager &QueryERMSObserverManager::GetInstance()
30 {
31 static QueryERMSObserverManager manager;
32 return manager;
33 }
34
AddObserver(int32_t recordId,const sptr<IQueryERMSObserver> & observer)35 int32_t QueryERMSObserverManager::AddObserver(int32_t recordId, const sptr<IQueryERMSObserver> &observer)
36 {
37 TAG_LOGD(AAFwkTag::QUERY_ERMS, "begin");
38 if (observer == nullptr) {
39 TAG_LOGE(AAFwkTag::QUERY_ERMS, "null observer");
40 return ERR_INVALID_VALUE;
41 }
42 {
43 std::lock_guard<ffrt::mutex> lock(observerLock_);
44 observerMap_[recordId] = observer;
45 }
46
47 if (!deathRecipient_) {
48 // add death recipient
49 deathRecipient_ = new QueryERMSObserverRecipient([](const wptr<IRemoteObject> &remote) {
50 QueryERMSObserverManager::GetInstance().OnObserverDied(remote);
51 });
52 }
53
54 auto observerObj = observer->AsObject();
55 if (!observerObj || !observerObj->AddDeathRecipient(deathRecipient_)) {
56 TAG_LOGE(AAFwkTag::QUERY_ERMS, "AddDeathRecipient failed");
57 }
58
59 return ERR_OK;
60 }
61
OnQueryFinished(int32_t recordId,const std::string & appId,const std::string & startTime,const AtomicServiceStartupRule & rule,int resultCode)62 void QueryERMSObserverManager::OnQueryFinished(int32_t recordId, const std::string &appId,
63 const std::string &startTime, const AtomicServiceStartupRule &rule, int resultCode)
64 {
65 auto task = [recordId, appId, startTime, rule, resultCode]() {
66 TAG_LOGI(AAFwkTag::QUERY_ERMS, "OnQueryFinished come");
67 QueryERMSObserverManager::GetInstance().HandleOnQueryFinished(
68 recordId, appId, startTime, rule, resultCode);
69 };
70
71 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
72 CHECK_POINTER_LOG(handler, "Fail to get Ability task handler.");
73 handler->SubmitTask(task);
74 }
75
HandleOnQueryFinished(int32_t recordId,const std::string & appId,const std::string & startTime,const AtomicServiceStartupRule & rule,int resultCode)76 void QueryERMSObserverManager::HandleOnQueryFinished(int32_t recordId, const std::string &appId,
77 const std::string &startTime, const AtomicServiceStartupRule &rule, int resultCode)
78 {
79 TAG_LOGD(AAFwkTag::QUERY_ERMS, "begin");
80 std::lock_guard<ffrt::mutex> lock(observerLock_);
81 auto iter = observerMap_.find(recordId);
82 if (iter != observerMap_.end() && iter->second != nullptr) {
83 (iter->second)->OnQueryFinished(appId, startTime, rule, resultCode);
84 }
85 }
86
OnObserverDied(const wptr<IRemoteObject> & remote)87 void QueryERMSObserverManager::OnObserverDied(const wptr<IRemoteObject> &remote)
88 {
89 TAG_LOGI(AAFwkTag::QUERY_ERMS, "called");
90 auto remoteObj = remote.promote();
91 if (remoteObj == nullptr) {
92 TAG_LOGE(AAFwkTag::QUERY_ERMS, "null observer");
93 return;
94 }
95 remoteObj->RemoveDeathRecipient(deathRecipient_);
96
97 std::lock_guard<ffrt::mutex> lock(observerLock_);
98 for (auto &item : observerMap_) {
99 if (item.second && item.second->AsObject() == remoteObj) {
100 observerMap_.erase(item.first);
101 return;
102 }
103 }
104 }
105
QueryERMSObserverRecipient(RemoteDiedHandler handler)106 QueryERMSObserverRecipient::QueryERMSObserverRecipient(RemoteDiedHandler handler) : handler_(handler)
107 {}
108
~QueryERMSObserverRecipient()109 QueryERMSObserverRecipient::~QueryERMSObserverRecipient()
110 {}
111
OnRemoteDied(const wptr<IRemoteObject> & remote)112 void QueryERMSObserverRecipient::OnRemoteDied(const wptr<IRemoteObject> &__attribute__((unused)) remote)
113 {
114 TAG_LOGI(AAFwkTag::QUERY_ERMS, "called");
115 if (handler_) {
116 handler_(remote);
117 }
118 }
119 } // namespace AAFwk
120 } // namespace OHOS