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
16 #include "session_listener_controller.h"
17
18 #include "window_manager_hilog.h"
19
20 namespace OHOS {
21 namespace Rosen {
22 namespace {
23 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "SessionListenerController"};
24 const std::string THREAD_NAME = "SessionListener";
25 }
26
SessionListenerController()27 SessionListenerController::SessionListenerController()
28 {
29 }
30
~SessionListenerController()31 SessionListenerController::~SessionListenerController()
32 {}
33
Init()34 void SessionListenerController::Init()
35 {
36 if (!taskScheduler_) {
37 taskScheduler_ = std::make_shared<TaskScheduler>(THREAD_NAME);
38 }
39 }
40
AddSessionListener(const sptr<ISessionListener> & listener)41 WSError SessionListenerController::AddSessionListener(const sptr<ISessionListener>& listener)
42 {
43 if (!listener) {
44 WLOGFE("listener is invalid");
45 return WSError::WS_ERROR_INVALID_PARAM;
46 }
47
48 std::lock_guard<ffrt::mutex> guard(listenerLock_);
49 auto it = std::find_if(sessionListeners_.begin(), sessionListeners_.end(),
50 [&listener](const sptr<ISessionListener>& item) {
51 return (item && item->AsObject() == listener->AsObject());
52 });
53 if (it != sessionListeners_.end()) {
54 WLOGFW("listener was already added, do not add again");
55 return WSError::WS_OK;
56 }
57
58 if (!listenerDeathRecipient_) {
59 std::weak_ptr<SessionListenerController> thisWeakPtr(shared_from_this());
60 listenerDeathRecipient_ = new ListenerDeathRecipient([thisWeakPtr](const wptr<IRemoteObject>& remote) {
61 auto controller = thisWeakPtr.lock();
62 if (controller) {
63 controller->OnListenerDied(remote);
64 }
65 });
66 }
67 auto listenerObject = listener->AsObject();
68 if (listenerObject) {
69 listenerObject->AddDeathRecipient(listenerDeathRecipient_);
70 }
71 sessionListeners_.emplace_back(listener);
72
73 return WSError::WS_OK;
74 }
75
DelSessionListener(const sptr<ISessionListener> & listener)76 void SessionListenerController::DelSessionListener(const sptr<ISessionListener>& listener)
77 {
78 if (!listener) {
79 WLOGFE("listener is invalid");
80 return;
81 }
82
83 std::lock_guard<ffrt::mutex> guard(listenerLock_);
84 auto it = std::find_if(sessionListeners_.begin(), sessionListeners_.end(),
85 [&listener](const sptr<ISessionListener> item) {
86 return (item && item->AsObject() == listener->AsObject());
87 });
88 if (it != sessionListeners_.end()) {
89 sessionListeners_.erase(it);
90 }
91 }
92
NotifySessionCreated(int32_t persistentId)93 void SessionListenerController::NotifySessionCreated(int32_t persistentId)
94 {
95 if (persistentId == -1) {
96 return;
97 }
98
99 if (!taskScheduler_) {
100 WLOGFE("taskScheduler is null");
101 return;
102 }
103 auto task = [weak = weak_from_this(), persistentId]() {
104 auto self = weak.lock();
105 if (self == nullptr) {
106 WLOGFE("self is nullptr, NotifySessionCreated failed");
107 return;
108 }
109 WLOGFI("NotifySessionCreated, persistentId:%{public}d.", persistentId);
110 self->CallListeners(&ISessionListener::OnMissionCreated, persistentId);
111 };
112 taskScheduler_->PostVoidSyncTask(task);
113 }
114
NotifySessionDestroyed(int32_t persistentId)115 void SessionListenerController::NotifySessionDestroyed(int32_t persistentId)
116 {
117 if (persistentId == -1) {
118 return;
119 }
120
121 if (!taskScheduler_) {
122 WLOGFE("taskScheduler is null");
123 return;
124 }
125 auto task = [weak = weak_from_this(), persistentId]() {
126 auto self = weak.lock();
127 if (self == nullptr) {
128 WLOGFE("self is nullptr, NotifySessionDestroyed failed");
129 return;
130 }
131 WLOGFI("NotifySessionDestroyed, persistentId:%{public}d.", persistentId);
132 self->CallListeners(&ISessionListener::OnMissionDestroyed, persistentId);
133 };
134 taskScheduler_->PostVoidSyncTask(task);
135 }
136
HandleUnInstallApp(const std::list<int32_t> & sessions)137 void SessionListenerController::HandleUnInstallApp(const std::list<int32_t>& sessions)
138 {
139 if (sessions.empty()) {
140 return;
141 }
142
143 if (!taskScheduler_) {
144 WLOGFE("taskScheduler is null");
145 return;
146 }
147 auto task = [weak = weak_from_this(), sessions]() {
148 auto self = weak.lock();
149 if (self == nullptr) {
150 WLOGFE("self is nullptr, HandleUnInstallApp failed");
151 return;
152 }
153 for (auto id : sessions) {
154 self->CallListeners(&ISessionListener::OnMissionDestroyed, id);
155 }
156 };
157 taskScheduler_->PostVoidSyncTask(task);
158 }
159
NotifySessionSnapshotChanged(int32_t persistentId)160 void SessionListenerController::NotifySessionSnapshotChanged(int32_t persistentId)
161 {
162 if (persistentId == -1) {
163 return;
164 }
165
166 if (!taskScheduler_) {
167 WLOGFE("taskScheduler is null");
168 return;
169 }
170 auto task = [weak = weak_from_this(), persistentId]() {
171 auto self = weak.lock();
172 if (self == nullptr) {
173 WLOGFE("self is nullptr, NotifySessionSnapshotChanged failed");
174 return;
175 }
176 WLOGFI("NotifySessionSnapshotChanged, persistentId:%{public}d.", persistentId);
177 self->CallListeners(&ISessionListener::OnMissionSnapshotChanged, persistentId);
178 };
179 taskScheduler_->PostVoidSyncTask(task);
180 }
181
NotifySessionMovedToFront(int32_t persistentId)182 void SessionListenerController::NotifySessionMovedToFront(int32_t persistentId)
183 {
184 if (persistentId == -1) {
185 return;
186 }
187
188 if (!taskScheduler_) {
189 WLOGFE("taskScheduler is null");
190 return;
191 }
192 auto task = [weak = weak_from_this(), persistentId]() {
193 auto self = weak.lock();
194 if (self == nullptr) {
195 WLOGFE("self is nullptr, NotifySessionMovedToFront failed");
196 return;
197 }
198 WLOGFI("NotifySessionMovedToFront, persistentId:%{public}d.", persistentId);
199 self->CallListeners(&ISessionListener::OnMissionMovedToFront, persistentId);
200 };
201 taskScheduler_->PostVoidSyncTask(task);
202 }
203
NotifySessionFocused(int32_t persistentId)204 void SessionListenerController::NotifySessionFocused(int32_t persistentId)
205 {
206 if (persistentId == -1) {
207 return;
208 }
209
210 if (!taskScheduler_) {
211 WLOGFE("taskScheduler is null");
212 return;
213 }
214 auto task = [weak = weak_from_this(), persistentId]() {
215 auto self = weak.lock();
216 if (self == nullptr) {
217 WLOGFE("self is nullptr, NotifySessionFocused failed");
218 return;
219 }
220 WLOGFI("NotifySessionFocused, persistentId:%{public}d.", persistentId);
221 self->CallListeners(&ISessionListener::OnMissionFocused, persistentId);
222 };
223 taskScheduler_->PostVoidSyncTask(task);
224 }
225
NotifySessionUnfocused(int32_t persistentId)226 void SessionListenerController::NotifySessionUnfocused(int32_t persistentId)
227 {
228 if (persistentId == -1) {
229 return;
230 }
231
232 if (!taskScheduler_) {
233 WLOGFE("taskScheduler is null");
234 return;
235 }
236 auto task = [weak = weak_from_this(), persistentId]() {
237 auto self = weak.lock();
238 if (self == nullptr) {
239 WLOGFE("self is nullptr, NotifySessionUnfocused failed");
240 return;
241 }
242 WLOGFI("NotifySessionUnfocused, persistentId:%{public}d.", persistentId);
243 self->CallListeners(&ISessionListener::OnMissionUnfocused, persistentId);
244 };
245 taskScheduler_->PostVoidSyncTask(task);
246 }
247
NotifySessionIconChanged(int32_t persistentId,const std::shared_ptr<OHOS::Media::PixelMap> & icon)248 void SessionListenerController::NotifySessionIconChanged(int32_t persistentId,
249 const std::shared_ptr<OHOS::Media::PixelMap>& icon)
250 {
251 if (persistentId == -1) {
252 return;
253 }
254
255 if (!taskScheduler_) {
256 WLOGFE("taskScheduler is null");
257 return;
258 }
259 auto task = [weak = weak_from_this(), persistentId, icon]() {
260 auto self = weak.lock();
261 if (self == nullptr) {
262 WLOGFE("self is nullptr, NotifySessionIconChanged failed");
263 return;
264 }
265 WLOGFI("NotifySessionIconChanged, persistentId:%{public}d.", persistentId);
266 self->CallListeners(&ISessionListener::OnMissionIconUpdated, persistentId, icon);
267 };
268 taskScheduler_->PostVoidSyncTask(task);
269 }
270
NotifySessionClosed(int32_t persistentId)271 void SessionListenerController::NotifySessionClosed(int32_t persistentId)
272 {
273 if (persistentId == -1) {
274 return;
275 }
276
277 if (!taskScheduler_) {
278 WLOGFE("taskScheduler is null");
279 return;
280 }
281 auto task = [weak = weak_from_this(), persistentId]() {
282 auto self = weak.lock();
283 if (self == nullptr) {
284 WLOGFE("self is nullptr, NotifySessionClosed failed");
285 return;
286 }
287 WLOGFI("NotifySessionClosed, persistentId:%{public}d.", persistentId);
288 self->CallListeners(&ISessionListener::OnMissionClosed, persistentId);
289 };
290 taskScheduler_->PostVoidSyncTask(task);
291 }
292
NotifySessionLabelUpdated(int32_t persistentId)293 void SessionListenerController::NotifySessionLabelUpdated(int32_t persistentId)
294 {
295 if (persistentId == -1) {
296 return;
297 }
298
299 if (!taskScheduler_) {
300 WLOGFE("taskScheduler is null");
301 return;
302 }
303 auto task = [weak = weak_from_this(), persistentId]() {
304 auto self = weak.lock();
305 if (self == nullptr) {
306 WLOGFE("self is nullptr, NotifySessionLabelUpdated failed");
307 return;
308 }
309 WLOGFI("NotifySessionLabelUpdated, persistentId:%{public}d.", persistentId);
310 self->CallListeners(&ISessionListener::OnMissionLabelUpdated, persistentId);
311 };
312 taskScheduler_->PostVoidSyncTask(task);
313 }
314
OnListenerDied(const wptr<IRemoteObject> & remote)315 void SessionListenerController::OnListenerDied(const wptr<IRemoteObject>& remote)
316 {
317 WLOGFD("On session listener died.");
318 auto remoteObj = remote.promote();
319 if (!remoteObj) {
320 WLOGFD("invalid remote object.");
321 return;
322 }
323 remoteObj->RemoveDeathRecipient(listenerDeathRecipient_);
324
325 std::lock_guard<ffrt::mutex> guard(listenerLock_);
326 auto it = std::find_if(sessionListeners_.begin(), sessionListeners_.end(),
327 [&remoteObj](const sptr<ISessionListener> item) {
328 return (item && item->AsObject() == remoteObj);
329 });
330 if (it != sessionListeners_.end()) {
331 sessionListeners_.erase(it);
332 }
333 }
334
ListenerDeathRecipient(ListenerDiedHandler handler)335 SessionListenerController::ListenerDeathRecipient::ListenerDeathRecipient(ListenerDiedHandler handler)
336 : diedHandler_(handler)
337 {}
338
OnRemoteDied(const wptr<IRemoteObject> & remote)339 void SessionListenerController::ListenerDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remote)
340 {
341 if (diedHandler_) {
342 diedHandler_(remote);
343 }
344 }
345 } // namespace Rosen
346 } // namespace OHOS
347