1 /*
2 * Copyright (c) 2023 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 "free_install_observer_manager.h"
16
17 #include <chrono>
18
19 #include "ability_event_handler.h"
20 #include "ability_manager_service.h"
21 #include "ability_manager_errors.h"
22 #include "hilog_wrapper.h"
23
24 namespace OHOS {
25 namespace AAFwk {
FreeInstallObserverManager()26 FreeInstallObserverManager::FreeInstallObserverManager()
27 {}
28
~FreeInstallObserverManager()29 FreeInstallObserverManager::~FreeInstallObserverManager()
30 {}
31
AddObserver(const sptr<IFreeInstallObserver> & observer)32 int32_t FreeInstallObserverManager::AddObserver(const sptr<IFreeInstallObserver> &observer)
33 {
34 HILOG_DEBUG("AddObserver begin.");
35 if (observer == nullptr) {
36 HILOG_ERROR("the observer is nullptr.");
37 return ERR_INVALID_VALUE;
38 }
39 std::lock_guard<ffrt::mutex> lock(observerLock_);
40 if (ObserverExistLocked(observer)) {
41 HILOG_ERROR("Observer exist.");
42 return ERR_INVALID_VALUE;
43 }
44 observerList_.emplace_back(observer);
45 HILOG_DEBUG("observerList_ size:%{public}zu", observerList_.size());
46
47 if (!deathRecipient_) {
48 std::weak_ptr<FreeInstallObserverManager> thisWeakPtr(shared_from_this());
49 // add death recipient
50 deathRecipient_ =
51 new FreeInstallObserverRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
52 auto freeInstallObserverManager = thisWeakPtr.lock();
53 if (freeInstallObserverManager) {
54 freeInstallObserverManager->OnObserverDied(remote);
55 }
56 });
57 }
58
59 auto observerObj = observer->AsObject();
60 if (!observerObj || !observerObj->AddDeathRecipient(deathRecipient_)) {
61 HILOG_ERROR("AddDeathRecipient failed.");
62 }
63
64 return ERR_OK;
65 }
66
RemoveObserver(const sptr<IFreeInstallObserver> & observer)67 int32_t FreeInstallObserverManager::RemoveObserver(const sptr<IFreeInstallObserver> &observer)
68 {
69 HILOG_DEBUG("RemoveObserver begin.");
70 if (observer == nullptr) {
71 HILOG_ERROR("the observer is nullptr.");
72 return ERR_INVALID_VALUE;
73 }
74 std::lock_guard<ffrt::mutex> lock(observerLock_);
75 auto it = std::find_if(observerList_.begin(), observerList_.end(),
76 [&observer](const sptr<IFreeInstallObserver> &item) {
77 return (item && item->AsObject() == observer->AsObject());
78 });
79 if (it != observerList_.end()) {
80 observerList_.erase(it);
81 HILOG_INFO("observerList_ size:%{public}zu", observerList_.size());
82 return ERR_OK;
83 }
84 HILOG_ERROR("Observer not exist or has been removed.");
85 return ERR_INVALID_VALUE;
86 }
87
OnInstallFinished(const std::string & bundleName,const std::string & abilityName,const std::string & startTime,const int & resultCode)88 void FreeInstallObserverManager::OnInstallFinished(const std::string &bundleName, const std::string &abilityName,
89 const std::string &startTime, const int &resultCode)
90 {
91 auto task = [weak = weak_from_this(), bundleName, abilityName, startTime, resultCode]() {
92 auto self = weak.lock();
93 if (self == nullptr) {
94 HILOG_ERROR("self is nullptr, OnInstallFinished failed.");
95 return;
96 }
97 HILOG_INFO("OnInstallFinished come.");
98 self->HandleOnInstallFinished(bundleName, abilityName, startTime, resultCode);
99 };
100
101 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
102 CHECK_POINTER_LOG(handler, "Fail to get Ability task handler.");
103 handler->SubmitTask(task);
104 }
105
HandleOnInstallFinished(const std::string & bundleName,const std::string & abilityName,const std::string & startTime,const int & resultCode)106 void FreeInstallObserverManager::HandleOnInstallFinished(const std::string &bundleName, const std::string &abilityName,
107 const std::string &startTime, const int &resultCode)
108 {
109 HILOG_DEBUG("HandleOnInstallFinished begin.");
110 for (auto it = observerList_.begin(); it != observerList_.end(); ++it) {
111 if ((*it) == nullptr) {
112 continue;
113 }
114 (*it)->OnInstallFinished(bundleName, abilityName, startTime, resultCode);
115 }
116 }
117
ObserverExistLocked(const sptr<IFreeInstallObserver> & observer)118 bool FreeInstallObserverManager::ObserverExistLocked(const sptr<IFreeInstallObserver> &observer)
119 {
120 HILOG_DEBUG("ObserExist begin.");
121 if (observer == nullptr) {
122 HILOG_ERROR("The param observer is nullptr.");
123 return false;
124 }
125 auto it = std::find_if(observerList_.begin(), observerList_.end(),
126 [&observer](const sptr<IFreeInstallObserver> &item) {
127 return (item && item->AsObject() == observer->AsObject());
128 });
129 return it != observerList_.end();
130 }
131
OnObserverDied(const wptr<IRemoteObject> & remote)132 void FreeInstallObserverManager::OnObserverDied(const wptr<IRemoteObject> &remote)
133 {
134 HILOG_INFO("OnObserverDied begin.");
135 auto remoteObj = remote.promote();
136 if (remoteObj == nullptr) {
137 HILOG_ERROR("observer is nullptr.");
138 return;
139 }
140 remoteObj->RemoveDeathRecipient(deathRecipient_);
141
142 std::lock_guard<ffrt::mutex> lock(observerLock_);
143 auto it = std::find_if(observerList_.begin(), observerList_.end(), [&remoteObj]
144 (const sptr<IFreeInstallObserver> item) {
145 return (item && item->AsObject() == remoteObj);
146 });
147 if (it != observerList_.end()) {
148 observerList_.erase(it);
149 }
150 }
151
FreeInstallObserverRecipient(RemoteDiedHandler handler)152 FreeInstallObserverRecipient::FreeInstallObserverRecipient(RemoteDiedHandler handler) : handler_(handler)
153 {}
154
~FreeInstallObserverRecipient()155 FreeInstallObserverRecipient::~FreeInstallObserverRecipient()
156 {}
157
OnRemoteDied(const wptr<IRemoteObject> & remote)158 void FreeInstallObserverRecipient::OnRemoteDied(const wptr<IRemoteObject> &__attribute__((unused)) remote)
159 {
160 HILOG_ERROR("FreeInstallObserverRecipient On remote died.");
161 if (handler_) {
162 handler_(remote);
163 }
164 }
165 } // namespace AAFwk
166 } // namespace OHOS