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_manager_lite.h"
17 #include <iremote_stub.h>
18 #include <iservice_registry.h>
19 #include <system_ability_definition.h>
20
21 #include "mock_session_manager_service_interface.h"
22 #include "session_manager_service_recover_interface.h"
23 #include "scene_session_manager_lite_proxy.h"
24 #include "window_manager_hilog.h"
25
26 namespace OHOS::Rosen {
27 namespace {
28 constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, HILOG_DOMAIN_DISPLAY, "SessionManagerLite" };
29 }
30
31 class SessionManagerServiceLiteRecoverListener : public IRemoteStub<ISessionManagerServiceRecoverListener> {
32 public:
33 explicit SessionManagerServiceLiteRecoverListener() = default;
34
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)35 virtual int32_t OnRemoteRequest(
36 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) override
37 {
38 if (data.ReadInterfaceToken() != GetDescriptor()) {
39 WLOGFE("[WMSRecover] InterfaceToken check failed");
40 return -1;
41 }
42 auto msgId = static_cast<SessionManagerServiceRecoverMessage>(code);
43 switch (msgId) {
44 case SessionManagerServiceRecoverMessage::TRANS_ID_ON_SESSION_MANAGER_SERVICE_RECOVER: {
45 auto sessionManagerService = data.ReadRemoteObject();
46 OnSessionManagerServiceRecover(sessionManagerService);
47 break;
48 }
49 default:
50 WLOGFW("[WMSRecover] unknown transaction code %{public}d", code);
51 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
52 }
53 return 0;
54 }
55
OnSessionManagerServiceRecover(const sptr<IRemoteObject> & sessionManagerService)56 void OnSessionManagerServiceRecover(const sptr<IRemoteObject>& sessionManagerService) override
57 {
58 SessionManagerLite::GetInstance().Clear();
59 SessionManagerLite::GetInstance().ClearSessionManagerProxy();
60
61 auto sms = iface_cast<ISessionManagerService>(sessionManagerService);
62 SessionManagerLite::GetInstance().RecoverSessionManagerService(sms);
63 }
64
OnWMSConnectionChanged(int32_t userId,int32_t screenId,bool isConnected)65 void OnWMSConnectionChanged(int32_t userId, int32_t screenId, bool isConnected) override
66 {
67 WLOGFD("OnWMSConnectionChanged lite: %{public}d, %{public}d, %{public}d", userId, screenId, isConnected);
68 }
69 };
70
71 class SceneSessionManagerLiteProxyMock : public SceneSessionManagerLiteProxy {
72 public:
SceneSessionManagerLiteProxyMock(const sptr<IRemoteObject> & impl)73 explicit SceneSessionManagerLiteProxyMock(const sptr<IRemoteObject>& impl)
74 : SceneSessionManagerLiteProxy(impl) {}
75 virtual ~SceneSessionManagerLiteProxyMock() = default;
76
RegisterSessionListener(const sptr<ISessionListener> & listener)77 WSError RegisterSessionListener(const sptr<ISessionListener>& listener) override
78 {
79 WLOGFI("[WMSRecover] RegisterSessionListener");
80 auto ret = SceneSessionManagerLiteProxy::RegisterSessionListener(listener);
81 if (ret != WSError::WS_OK) {
82 return ret;
83 }
84 SessionManagerLite::GetInstance().SaveSessionListener(listener);
85 return WSError::WS_OK;
86 }
UnRegisterSessionListener(const sptr<ISessionListener> & listener)87 WSError UnRegisterSessionListener(const sptr<ISessionListener>& listener) override
88 {
89 WLOGFI("[WMSRecover] UnRegisterSessionListener");
90 auto ret = SceneSessionManagerLiteProxy::UnRegisterSessionListener(listener);
91 SessionManagerLite::GetInstance().DeleteSessionListener(listener);
92 return ret;
93 }
94 private:
95 static inline BrokerDelegator<SceneSessionManagerLiteProxyMock> delegator_;
96 };
97
WM_IMPLEMENT_SINGLE_INSTANCE(SessionManagerLite)98 WM_IMPLEMENT_SINGLE_INSTANCE(SessionManagerLite)
99
100 SessionManagerLite::~SessionManagerLite()
101 {
102 WLOGFD("SessionManagerLite destroy");
103 DeleteAllSessionListeners();
104 std::lock_guard<std::recursive_mutex> lock(mutex_);
105 destroyed_ = true;
106 if (recoverListenerRegistered_ && mockSessionManagerServiceProxy_ != nullptr) {
107 mockSessionManagerServiceProxy_->UnregisterSMSLiteRecoverListener();
108 }
109 }
110
ClearSessionManagerProxy()111 void SessionManagerLite::ClearSessionManagerProxy()
112 {
113 WLOGFD("ClearSessionManagerProxy enter");
114 std::lock_guard<std::recursive_mutex> lock(mutex_);
115 if (destroyed_) {
116 WLOGFI("Already destroyed");
117 return;
118 }
119
120 sessionManagerServiceProxy_ = nullptr;
121 sceneSessionManagerLiteProxy_ = nullptr;
122 screenSessionManagerLiteProxy_ = nullptr;
123 }
124
GetSceneSessionManagerLiteProxy()125 sptr<ISceneSessionManagerLite> SessionManagerLite::GetSceneSessionManagerLiteProxy()
126 {
127 std::lock_guard<std::recursive_mutex> lock(mutex_);
128 InitSessionManagerServiceProxy();
129 InitSceneSessionManagerLiteProxy();
130 return sceneSessionManagerLiteProxy_;
131 }
132
GetScreenSessionManagerLiteProxy()133 sptr<IScreenSessionManagerLite> SessionManagerLite::GetScreenSessionManagerLiteProxy()
134 {
135 std::lock_guard<std::recursive_mutex> lock(mutex_);
136 InitSessionManagerServiceProxy();
137 InitScreenSessionManagerLiteProxy();
138 return screenSessionManagerLiteProxy_;
139 }
140
SaveSessionListener(const sptr<ISessionListener> & listener)141 void SessionManagerLite::SaveSessionListener(const sptr<ISessionListener>& listener)
142 {
143 std::lock_guard<std::recursive_mutex> guard(listenerLock_);
144 auto it = std::find_if(sessionListeners_.begin(), sessionListeners_.end(),
145 [&listener](const sptr<ISessionListener>& item) {
146 return (item && item->AsObject() == listener->AsObject());
147 });
148 if (it != sessionListeners_.end()) {
149 WLOGFW("[WMSRecover] listener was already added, do not add again");
150 return;
151 }
152 sessionListeners_.emplace_back(listener);
153 }
154
DeleteSessionListener(const sptr<ISessionListener> & listener)155 void SessionManagerLite::DeleteSessionListener(const sptr<ISessionListener>& listener)
156 {
157 std::lock_guard<std::recursive_mutex> guard(listenerLock_);
158 auto it = std::find_if(sessionListeners_.begin(), sessionListeners_.end(),
159 [&listener](const sptr<ISessionListener>& item) {
160 return (item && item->AsObject() == listener->AsObject());
161 });
162 if (it != sessionListeners_.end()) {
163 sessionListeners_.erase(it);
164 }
165 }
166
DeleteAllSessionListeners()167 void SessionManagerLite::DeleteAllSessionListeners()
168 {
169 std::lock_guard<std::recursive_mutex> guard(listenerLock_);
170 sessionListeners_.clear();
171 }
172
RecoverSessionManagerService(const sptr<ISessionManagerService> & sessionManagerService)173 void SessionManagerLite::RecoverSessionManagerService(const sptr<ISessionManagerService>& sessionManagerService)
174 {
175 {
176 std::lock_guard<std::recursive_mutex> lock(mutex_);
177 sessionManagerServiceProxy_ = sessionManagerService;
178 }
179 GetSceneSessionManagerLiteProxy();
180 if (sceneSessionManagerLiteProxy_ == nullptr) {
181 WLOGFE("[WMSRecover] sceneSessionManagerLiteProxy_ is null");
182 return;
183 }
184
185 WLOGFI("[WMSRecover] RecoverSessionListeners, listener count = %{public}" PRIu64,
186 static_cast<int64_t>(sessionListeners_.size()));
187 for (const auto& listener: sessionListeners_) {
188 auto ret = sceneSessionManagerLiteProxy_->RegisterSessionListener(listener);
189 if (ret != WSError::WS_OK) {
190 WLOGFW("[WMSRecover] RegisterSessionListener failed, ret = %{public}" PRId32, ret);
191 }
192 }
193 }
194
InitSessionManagerServiceProxy()195 void SessionManagerLite::InitSessionManagerServiceProxy()
196 {
197 if (sessionManagerServiceProxy_) {
198 return;
199 }
200 sptr<ISystemAbilityManager> systemAbilityManager =
201 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
202 if (!systemAbilityManager) {
203 WLOGFE("Failed to get system ability mgr.");
204 return;
205 }
206 sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(WINDOW_MANAGER_SERVICE_ID);
207 if (!remoteObject) {
208 WLOGFE("Remote object is nullptr");
209 return;
210 }
211 mockSessionManagerServiceProxy_ = iface_cast<IMockSessionManagerInterface>(remoteObject);
212 if (!mockSessionManagerServiceProxy_) {
213 WLOGFW("Get mock session manager service proxy failed, nullptr");
214 return;
215 }
216 if (!recoverListenerRegistered_) {
217 recoverListenerRegistered_ = true;
218 smsRecoverListener_ = new SessionManagerServiceLiteRecoverListener();
219 mockSessionManagerServiceProxy_->RegisterSMSLiteRecoverListener(smsRecoverListener_);
220 }
221 sptr<IRemoteObject> remoteObject2 = mockSessionManagerServiceProxy_->GetSessionManagerService();
222 if (!remoteObject2) {
223 WLOGFE("Remote object2 is nullptr");
224 return;
225 }
226 sessionManagerServiceProxy_ = iface_cast<ISessionManagerService>(remoteObject2);
227 if (!sessionManagerServiceProxy_) {
228 WLOGFE("sessionManagerServiceProxy_ is nullptr");
229 }
230 }
231
InitScreenSessionManagerLiteProxy()232 void SessionManagerLite::InitScreenSessionManagerLiteProxy()
233 {
234 if (screenSessionManagerLiteProxy_) {
235 return;
236 }
237 if (!mockSessionManagerServiceProxy_) {
238 WLOGFE("mockSessionManagerServiceProxy_ is nullptr");
239 return;
240 }
241
242 sptr<IRemoteObject> remoteObject = mockSessionManagerServiceProxy_->GetScreenSessionManagerLite();
243 if (!remoteObject) {
244 WLOGFW("Get screen session manager lite proxy failed, scene session manager service is null");
245 return;
246 }
247 screenSessionManagerLiteProxy_ = iface_cast<IScreenSessionManagerLite>(remoteObject);
248 if (!screenSessionManagerLiteProxy_) {
249 WLOGFW("Get screen session manager lite proxy failed, nullptr");
250 }
251 }
252
InitSceneSessionManagerLiteProxy()253 void SessionManagerLite::InitSceneSessionManagerLiteProxy()
254 {
255 if (sceneSessionManagerLiteProxy_) {
256 return;
257 }
258 if (!sessionManagerServiceProxy_) {
259 WLOGFE("sessionManagerServiceProxy_ is nullptr");
260 return;
261 }
262
263 sptr<IRemoteObject> remoteObject = sessionManagerServiceProxy_->GetSceneSessionManagerLite();
264 if (!remoteObject) {
265 WLOGFW("Get scene session manager proxy failed, scene session manager service is null");
266 return;
267 }
268 sceneSessionManagerLiteProxy_ = iface_cast<ISceneSessionManagerLite>(remoteObject);
269 if (sceneSessionManagerLiteProxy_) {
270 ssmDeath_ = new (std::nothrow) SSMDeathRecipientLite();
271 if (!ssmDeath_) {
272 WLOGFE("Failed to create death Recipient ptr WMSDeathRecipient");
273 return;
274 }
275 if (remoteObject->IsProxyObject() && !remoteObject->AddDeathRecipient(ssmDeath_)) {
276 WLOGFE("Failed to add death recipient");
277 return;
278 }
279 }
280 if (!sceneSessionManagerLiteProxy_) {
281 WLOGFW("Get scene session manager proxy failed, nullptr");
282 }
283 }
284
Clear()285 void SessionManagerLite::Clear()
286 {
287 std::lock_guard<std::recursive_mutex> lock(mutex_);
288 if ((sceneSessionManagerLiteProxy_ != nullptr) && (sceneSessionManagerLiteProxy_->AsObject() != nullptr)) {
289 sceneSessionManagerLiteProxy_->AsObject()->RemoveDeathRecipient(ssmDeath_);
290 }
291 }
292
OnRemoteDied(const wptr<IRemoteObject> & wptrDeath)293 void SSMDeathRecipientLite::OnRemoteDied(const wptr<IRemoteObject>& wptrDeath)
294 {
295 if (wptrDeath == nullptr) {
296 WLOGFE("SSMDeathRecipientLite wptrDeath is null");
297 return;
298 }
299
300 sptr<IRemoteObject> object = wptrDeath.promote();
301 if (!object) {
302 WLOGFE("SSMDeathRecipientLite object is null");
303 return;
304 }
305 WLOGI("ssm OnRemoteDied");
306 SessionManagerLite::GetInstance().Clear();
307 SessionManagerLite::GetInstance().ClearSessionManagerProxy();
308 }
309 } // namespace OHOS::Rosen
310