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