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