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 {
23
24 // Mock class for QueryERMSObserver
25 class MockQueryERMSObserver : public IQueryERMSObserver {
26 public:
OnQueryFinished(const std::string & appId,const std::string & startTime,const AbilityRuntime::AtomicServiceStartupRule & rule,int resultCode)27 void OnQueryFinished(const std::string &appId, const std::string &startTime,
28 const AbilityRuntime::AtomicServiceStartupRule &rule, int resultCode) override {}
AsObject()29 sptr<IRemoteObject> AsObject() override { return nullptr; }
30 };
31
QueryERMSObserverManager()32 QueryERMSObserverManager::QueryERMSObserverManager()
33 {}
34
~QueryERMSObserverManager()35 QueryERMSObserverManager::~QueryERMSObserverManager()
36 {}
37
GetInstance()38 QueryERMSObserverManager &QueryERMSObserverManager::GetInstance()
39 {
40 static QueryERMSObserverManager manager;
41 return manager;
42 }
43
AddObserver(int32_t recordId,const sptr<IQueryERMSObserver> & observer)44 int32_t QueryERMSObserverManager::AddObserver(int32_t recordId, const sptr<IQueryERMSObserver> &observer)
45 {
46 TAG_LOGD(AAFwkTag::QUERY_ERMS, "test::begin");
47 if (observer == nullptr) {
48 TAG_LOGE(AAFwkTag::QUERY_ERMS, "null observer");
49 return ERR_INVALID_VALUE;
50 }
51 return ERR_OK;
52 }
53
OnQueryFinished(int32_t recordId,const std::string & appId,const std::string & startTime,const AtomicServiceStartupRule & rule,int resultCode)54 void QueryERMSObserverManager::OnQueryFinished(int32_t recordId, const std::string &appId,
55 const std::string &startTime, const AtomicServiceStartupRule &rule, int resultCode)
56 {
57 sptr<IQueryERMSObserver> observer = nullptr;
58 if (ERR_OK == resultCode) {
59 observer = sptr<IQueryERMSObserver>(new MockQueryERMSObserver());
60 }
61 observerMap_[recordId] = observer;
62 TAG_LOGI(AAFwkTag::QUERY_ERMS, "testcalled");
63 }
64
HandleOnQueryFinished(int32_t recordId,const std::string & appId,const std::string & startTime,const AtomicServiceStartupRule & rule,int resultCode)65 void QueryERMSObserverManager::HandleOnQueryFinished(int32_t recordId, const std::string &appId,
66 const std::string &startTime, const AtomicServiceStartupRule &rule, int resultCode)
67 {
68 sptr<IQueryERMSObserver> observer = nullptr;
69 if (ERR_OK == resultCode) {
70 observer = sptr<IQueryERMSObserver>(new MockQueryERMSObserver());
71 }
72 observerMap_[recordId] = observer;
73 TAG_LOGI(AAFwkTag::QUERY_ERMS, "testcalled");
74 }
75
OnObserverDied(const wptr<IRemoteObject> & remote)76 void QueryERMSObserverManager::OnObserverDied(const wptr<IRemoteObject> &remote)
77 {
78 TAG_LOGI(AAFwkTag::QUERY_ERMS, "called");
79 auto remoteObj = remote.promote();
80 if (remoteObj == nullptr) {
81 TAG_LOGE(AAFwkTag::QUERY_ERMS, "null observer");
82 return;
83 }
84 remoteObj->RemoveDeathRecipient(deathRecipient_);
85
86 std::lock_guard<ffrt::mutex> lock(observerLock_);
87 for (auto &item : observerMap_) {
88 if (item.second && item.second->AsObject() == remoteObj) {
89 observerMap_.erase(item.first);
90 return;
91 }
92 }
93 }
94
QueryERMSObserverRecipient(RemoteDiedHandler handler)95 QueryERMSObserverRecipient::QueryERMSObserverRecipient(RemoteDiedHandler handler) : handler_(handler)
96 {}
97
~QueryERMSObserverRecipient()98 QueryERMSObserverRecipient::~QueryERMSObserverRecipient()
99 {}
100
OnRemoteDied(const wptr<IRemoteObject> & remote)101 void QueryERMSObserverRecipient::OnRemoteDied(const wptr<IRemoteObject> &__attribute__((unused)) remote)
102 {
103 TAG_LOGI(AAFwkTag::QUERY_ERMS, "called");
104 if (handler_) {
105 handler_(remote);
106 }
107 }
108 } // namespace AAFwk
109 } // namespace OHOS