• 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 
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