1 /*
2 * Copyright (c) 2022-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 "audio_device_manager.h"
17 #include "avsession_service.h"
18
19 #include "migrate_avsession_manager.h"
20
21 namespace OHOS::AVSession {
SuperLauncher(std::string deviceId,std::string serviceName,std::string extraInfo,const std::string & state)22 void AVSessionService::SuperLauncher(std::string deviceId, std::string serviceName,
23 std::string extraInfo, const std::string& state)
24 {
25 SLOGI("SuperLauncher serviceName: %{public}s, state: %{public}s", serviceName.c_str(), state.c_str());
26
27 if (serviceName == "SuperLauncher-Dual") {
28 if (state == "IDLE") {
29 ReleaseSuperLauncher(serviceName);
30 } else if (state == "CONNECTING") {
31 ConnectSuperLauncher(deviceId, serviceName);
32 } else if (state == "CONNECT_SUCC") {
33 SucceedSuperLauncher(deviceId, extraInfo);
34 }
35 }
36 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
37 if ((serviceName == "HuaweiCast" || serviceName == "HuaweiCast-Dual") &&
38 (state == "IDLE" || state == "CONNECT_SUCC")) {
39 castserviceNameStatePair_ = std::make_pair(serviceName, state);
40 isSupportMirrorToStream_ = false;
41 castDeviceId_ = "0";
42 castDeviceName_ = " ";
43 castDeviceType_ = 0;
44 std::string info;
45 std::string::size_type beginPos = 0;
46 std::string::size_type endPos = extraInfo.find(seperator);
47 while (endPos != std::string::npos) {
48 info = extraInfo.substr(beginPos, endPos - beginPos);
49 beginPos = endPos + seperator.size();
50 endPos = extraInfo.find(seperator, beginPos);
51 SplitExtraInfo(info);
52 }
53 if (beginPos != extraInfo.length()) {
54 info = extraInfo.substr(beginPos);
55 SplitExtraInfo(info);
56 }
57 NotifyMirrorToStreamCast();
58 int32_t sessionSize = static_cast<int32_t>(GetUsersManager().GetContainerFromAll().GetAllSessions().size());
59 if ((sessionSize == 0 || (sessionSize == 1 && CheckAncoAudio())) && !is2in1_ && state == "IDLE") {
60 SLOGI("call disable cast for cast idle");
61 checkEnableCast(false);
62 }
63 }
64 #endif
65 }
66
ReleaseSuperLauncher(std::string serviceName)67 void AVSessionService::ReleaseSuperLauncher(std::string serviceName)
68 {
69 MigrateAVSessionManager::GetInstance().ReleaseLocalSessionStub(serviceName);
70 if (migrateAVSession_ != nullptr) {
71 RemoveInnerSessionListener(migrateAVSession_.get());
72 RemoveHistoricalRecordListener(migrateAVSession_.get());
73 }
74 }
75
ConnectSuperLauncher(std::string deviceId,std::string serviceName)76 void AVSessionService::ConnectSuperLauncher(std::string deviceId, std::string serviceName)
77 {
78 if (migrateAVSession_ == nullptr) {
79 migrateAVSession_ = std::make_shared<MigrateAVSessionServer>();
80 }
81 migrateAVSession_->Init(this);
82 MigrateAVSessionManager::GetInstance().CreateLocalSessionStub(serviceName, migrateAVSession_);
83 AddInnerSessionListener(migrateAVSession_.get());
84 AddHistoricalRecordListener(migrateAVSession_.get());
85 AudioDeviceManager::GetInstance().InitAudioStateCallback(migrateAVSession_, deviceId);
86 }
87
SucceedSuperLauncher(std::string deviceId,std::string extraInfo)88 void AVSessionService::SucceedSuperLauncher(std::string deviceId, std::string extraInfo)
89 {
90 if (migrateAVSession_ == nullptr) {
91 migrateAVSession_ = std::make_shared<MigrateAVSessionServer>();
92 }
93 migrateAVSession_->ResetSupportCrossMediaPlay(extraInfo);
94 migrateAVSession_->SendRemoteHistorySessionList(deviceId);
95 }
96
NotifyMigrateStop(const std::string & deviceId)97 void AVSessionService::NotifyMigrateStop(const std::string &deviceId)
98 {
99 if (migrateAVSession_ == nullptr) {
100 SLOGI("NotifyMigrateStop without migrate, create new");
101 migrateAVSession_ = std::make_shared<MigrateAVSessionServer>();
102 }
103 std::lock_guard lockGuard(sessionServiceLock_);
104 migrateAVSession_->StopObserveControllerChanged(deviceId);
105 AudioDeviceManager::GetInstance().UnInitAudioStateCallback();
106 }
107
108 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
SplitExtraInfo(std::string info)109 void AVSessionService::SplitExtraInfo(std::string info)
110 {
111 if (info.find("SUPPORT_MIRROR_TO_STREAM") != std::string::npos && info.find("true") != std::string::npos) {
112 isSupportMirrorToStream_ = true;
113 }
114 if (info.find("deviceId") != std::string::npos && info.find(":") != std::string::npos) {
115 std::string::size_type idBeginPos = info.find(":");
116 castDeviceId_ = info.substr(idBeginPos + beginAddPos,
117 info.length() -idBeginPos - endDecPos); // "deviceId" : "xxxx"
118 }
119 if (info.find("deviceName") != std::string::npos && info.find(":") != std::string::npos) {
120 std::string::size_type nameBeginPos = info.find(":");
121 castDeviceName_ = info.substr(nameBeginPos + beginAddPos,
122 info.length() - nameBeginPos - endDecPos); // "deviceName" : "xxxx"
123 }
124 if (info.find("deviceType") != std::string::npos && info.find(":") != std::string::npos) {
125 std::string::size_type typeBeginPos = info.find(":");
126 std::string tmpType = info.substr(typeBeginPos + typeAddPos, info.length()); // "deviceType" : xxx
127 castDeviceType_ = atoi(tmpType.c_str());
128 }
129 }
130 #endif
131
AddInnerSessionListener(SessionListener * listener)132 void AVSessionService::AddInnerSessionListener(SessionListener *listener)
133 {
134 std::lock_guard lockGuard(sessionListenersLock_);
135 innerSessionListeners_.push_back(listener);
136 }
137
RemoveInnerSessionListener(SessionListener * listener)138 void AVSessionService::RemoveInnerSessionListener(SessionListener *listener)
139 {
140 std::lock_guard lockGuard(sessionListenersLock_);
141 for (auto it = innerSessionListeners_.begin(); it != innerSessionListeners_.end();) {
142 if (*it == listener) {
143 SLOGI("RemoveInnerSessionListener");
144 it = innerSessionListeners_.erase(it);
145 } else {
146 it++;
147 }
148 }
149 }
150
AddHistoricalRecordListener(HistoricalRecordListener * listener)151 void AVSessionService::AddHistoricalRecordListener(HistoricalRecordListener *listener)
152 {
153 std::lock_guard lockGuard(historicalRecordListenersLock_);
154 historicalRecordListeners_.push_back(listener);
155 }
156
RemoveHistoricalRecordListener(HistoricalRecordListener * listener)157 void AVSessionService::RemoveHistoricalRecordListener(HistoricalRecordListener *listener)
158 {
159 std::lock_guard lockGuard(historicalRecordListenersLock_);
160 for (auto it = historicalRecordListeners_.begin(); it != historicalRecordListeners_.end();) {
161 if (*it == listener) {
162 SLOGI("RemoveHistoricalRecordListener");
163 it = historicalRecordListeners_.erase(it);
164 } else {
165 it++;
166 }
167 }
168 }
169
NotifyHistoricalRecordChange(const std::string & bundleName,int32_t userId)170 void AVSessionService::NotifyHistoricalRecordChange(const std::string& bundleName, int32_t userId)
171 {
172 std::lock_guard lockGuard(historicalRecordListenersLock_);
173 for (const auto& listener : historicalRecordListeners_) {
174 if (listener != nullptr) {
175 listener->OnHistoricalRecordChange();
176 }
177 }
178 }
179
180 // LCOV_EXCL_START
HandleAppStateChange(int uid,int state)181 void AVSessionService::HandleAppStateChange(int uid, int state)
182 {
183 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
184 SLOGD("uid = %{public}d, state = %{public}d", uid, state);
185 if (topSession_ != nullptr && topSession_->GetUid() == uid) {
186 if (state == appState) {
187 return;
188 }
189 if (state == static_cast<int>(AppExecFwk::ApplicationState::APP_STATE_FOREGROUND)) {
190 SLOGI("enter notifyMirrorToStreamCast by background to foreground state change, and counts = 2");
191 MirrorToStreamCast(topSession_);
192 }
193 appState = state;
194 }
195 #endif //CASTPLUS_CAST_ENGINE_ENABLE
196 }
197 // LCOV_EXCL_STOP
198
199 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
GetAVCastControllerInner(const std::string & sessionId,sptr<IRemoteObject> & object)200 int32_t AVSessionService::GetAVCastControllerInner(const std::string& sessionId, sptr<IRemoteObject>& object)
201 {
202 SLOGI("Start get cast controller with pid %{public}d", static_cast<int>(GetCallingPid()));
203 auto session = GetContainer().GetSessionById(sessionId);
204 CHECK_AND_RETURN_RET_LOG(session != nullptr, AVSESSION_ERROR, "StopCast: session is not exist");
205 auto result = session->GetAVCastControllerInner();
206 CHECK_AND_RETURN_RET_LOG(result != nullptr, AVSESSION_ERROR, "GetAVCastControllerInner failed");
207 object = result;
208 return AVSESSION_SUCCESS;
209 }
210
checkEnableCast(bool enable)211 int32_t AVSessionService::checkEnableCast(bool enable)
212 {
213 std::lock_guard lockGuard(checkEnableCastLock_);
214 SLOGI("checkEnableCast enable:%{public}d, isInCast:%{public}d", enable, isInCast_);
215 if (enable == true && isInCast_ == false) {
216 isInCast_ = AVRouter::GetInstance().Init(this) == AVSESSION_SUCCESS ? true : false;
217 } else if (enable == false && isInCast_ == true) {
218 CHECK_AND_RETURN_RET_LOG(!((GetContainer().GetAllSessions().size() > 1 ||
219 (GetContainer().GetAllSessions().size() == 1 && !CheckAncoAudio())) && !is2in1_),
220 AVSESSION_SUCCESS, "can not release cast with session alive");
221 CHECK_AND_RETURN_RET_LOG(castserviceNameStatePair_.second != deviceStateConnection,
222 AVSESSION_SUCCESS, "can not release cast with casting");
223 isInCast_ = AVRouter::GetInstance().Release();
224 } else {
225 SLOGD("AVRouter Init in nothing change");
226 }
227 return AVSESSION_SUCCESS;
228 }
229
setInCast(bool isInCast)230 void AVSessionService::setInCast(bool isInCast)
231 {
232 SLOGI("setInCast, isInCast:%{public}d", isInCast);
233 isInCast_ = isInCast;
234 }
235
236 // LCOV_EXCL_START
ReleaseCastSession()237 void AVSessionService::ReleaseCastSession()
238 {
239 std::lock_guard lockGuard(sessionServiceLock_);
240 SLOGI("Start release cast session");
241 for (const auto& session : GetContainer().GetAllSessions()) {
242 if (session != nullptr && session->GetDescriptor().sessionTag_ == "RemoteCast") {
243 std::string sessionId = session->GetDescriptor().sessionId_;
244 SLOGI("Already has a cast session %{public}s", AVSessionUtils::GetAnonySessionId(sessionId).c_str());
245 session->UnRegisterDeviceStateCallback();
246 session->StopCastSession();
247 session->ReleaseAVCastControllerInner();
248 HandleSessionRelease(sessionId);
249 }
250 }
251 }
252 // LCOV_EXCL_STOP
253
254 // LCOV_EXCL_START
CreateSessionByCast(const int64_t castHandle)255 void AVSessionService::CreateSessionByCast(const int64_t castHandle)
256 {
257 SLOGI("AVSessionService CreateSessionByCast in");
258 AVSessionRadarInfo info("AVSessionService::CreateSessionByCast");
259 AVSessionRadar::GetInstance().StartConnect(info);
260 AppExecFwk::ElementName elementName;
261 elementName.SetBundleName("castBundleName");
262 elementName.SetAbilityName("castAbilityName");
263 sptr<AVSessionItem> sinkSession;
264 auto res = CreateSessionInner("RemoteCast", AVSession::SESSION_TYPE_AUDIO, false, elementName, sinkSession);
265 CHECK_AND_RETURN_LOG(res == AVSESSION_SUCCESS, "CreateSession at sink failed");
266 SLOGI("Create Cast sink sessionId %{public}s",
267 AVSessionUtils::GetAnonySessionId(sinkSession->GetSessionId()).c_str());
268 sinkSession->SetCastHandle(castHandle);
269 sinkSession->RegisterDeviceStateCallback();
270
271 {
272 std::lock_guard frontLockGuard(sessionFrontLock_);
273 std::shared_ptr<std::list<sptr<AVSessionItem>>> sessionListForFront =
274 GetUsersManager().GetCurSessionListForFront(0);
275 CHECK_AND_RETURN_LOG(sessionListForFront != nullptr, "sessionListForFront ptr nullptr!");
276 auto it = std::find(sessionListForFront->begin(), sessionListForFront->end(), sinkSession);
277 if (it == sessionListForFront->end()) {
278 SLOGI(" front session add cast session");
279 sessionListForFront->push_front(sinkSession);
280 }
281 }
282
283 HISYSEVENT_BEHAVIOR("SESSION_CAST",
284 "BUNDLE_NAME", "castBundleName",
285 "ABILITY_NAME", "castAbilityName",
286 "SESSION_PID", sinkSession->GetDescriptor().pid_,
287 "SESSION_UID", sinkSession->GetDescriptor().uid_,
288 "SESSION_ID", sinkSession->GetDescriptor().sessionId_,
289 "SESSION_TAG", sinkSession->GetDescriptor().sessionTag_,
290 "SESSION_TYPE", sinkSession->GetDescriptor().sessionType_,
291 "DETAILED_MSG", "session create from cast+ callback");
292 }
293 // LCOV_EXCL_STOP
294
295 // LCOV_EXCL_START
NotifyDeviceAvailable(const OutputDeviceInfo & castOutputDeviceInfo)296 void AVSessionService::NotifyDeviceAvailable(const OutputDeviceInfo& castOutputDeviceInfo)
297 {
298 AVSessionRadarInfo info("AVSessionService::NotifyDeviceAvailable");
299 AVSessionRadar::GetInstance().CastDeviceAvailable(castOutputDeviceInfo, info);
300
301 for (DeviceInfo deviceInfo : castOutputDeviceInfo.deviceInfos_) {
302 for (const auto& session : GetContainer().GetAllSessions()) {
303 session->UpdateCastDeviceMap(deviceInfo);
304 }
305 }
306 std::lock_guard lockGuard(sessionListenersLock_);
307 for (const auto& listener : innerSessionListeners_) {
308 listener->OnDeviceAvailable(castOutputDeviceInfo);
309 }
310 std::map<pid_t, sptr<ISessionListener>> listenerMap = GetUsersManager().GetSessionListener();
311 for (const auto& [pid, listener] : listenerMap) {
312 AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceAvailable");
313 listener->OnDeviceAvailable(castOutputDeviceInfo);
314 }
315 std::map<pid_t, sptr<ISessionListener>> listenerMapForAll = GetUsersManager().GetSessionListenerForAllUsers();
316 for (const auto& [pid, listener] : listenerMapForAll) {
317 AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceAvailable");
318 listener->OnDeviceAvailable(castOutputDeviceInfo);
319 }
320 }
321 // LCOV_EXCL_STOP
322
NotifyDeviceLogEvent(const DeviceLogEventCode eventId,const int64_t param)323 void AVSessionService::NotifyDeviceLogEvent(const DeviceLogEventCode eventId, const int64_t param)
324 {
325 std::lock_guard lockGuard(sessionListenersLock_);
326 std::map<pid_t, sptr<ISessionListener>> listenerMap = GetUsersManager().GetSessionListener();
327 for (const auto& [pid, listener] : listenerMap) {
328 AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceLogEvent");
329 listener->OnDeviceLogEvent(eventId, param);
330 }
331 std::map<pid_t, sptr<ISessionListener>> listenerMapForAll = GetUsersManager().GetSessionListenerForAllUsers();
332 for (const auto& [pid, listener] : listenerMapForAll) {
333 AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceLogEvent");
334 listener->OnDeviceLogEvent(eventId, param);
335 }
336 }
337
338 // LCOV_EXCL_START
NotifyDeviceOffline(const std::string & deviceId)339 void AVSessionService::NotifyDeviceOffline(const std::string& deviceId)
340 {
341 std::lock_guard lockGuard(sessionListenersLock_);
342 for (const auto& listener : innerSessionListeners_) {
343 listener->OnDeviceOffline(deviceId);
344 }
345 std::map<pid_t, sptr<ISessionListener>> listenerMap = GetUsersManager().GetSessionListener();
346 for (const auto& [pid, listener] : listenerMap) {
347 SLOGI("notify device offline with pid %{public}d", static_cast<int>(pid));
348 AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceOffline");
349 listener->OnDeviceOffline(deviceId);
350 }
351 std::map<pid_t, sptr<ISessionListener>> listenerMapForAll = GetUsersManager().GetSessionListenerForAllUsers();
352 for (const auto& [pid, listener] : listenerMapForAll) {
353 SLOGI("notify device offline with pid %{public}d across users", static_cast<int>(pid));
354 AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceOffline");
355 listener->OnDeviceOffline(deviceId);
356 }
357 }
358 // LCOV_EXCL_STOP
359
StartCast(const SessionToken & sessionToken,const OutputDeviceInfo & outputDeviceInfo)360 int32_t AVSessionService::StartCast(const SessionToken& sessionToken, const OutputDeviceInfo& outputDeviceInfo)
361 {
362 SLOGI("SessionId is %{public}s", AVSessionUtils::GetAnonySessionId(sessionToken.sessionId).c_str());
363 sptr<AVSessionItem> session = GetContainer().GetSessionById(sessionToken.sessionId);
364 CHECK_AND_RETURN_RET_LOG(session != nullptr, ERR_SESSION_NOT_EXIST, "session %{public}s not exist",
365 AVSessionUtils::GetAnonySessionId(sessionToken.sessionId).c_str());
366 ReportStartCastBegin("AVSessionService::StartCast", outputDeviceInfo, session->GetDescriptor().uid_);
367 int32_t ret = session->StartCast(outputDeviceInfo);
368 ReportStartCastEnd("AVSessionService::StartCast", outputDeviceInfo, session->GetDescriptor().uid_, ret);
369 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "StartCast failed");
370 SLOGD("StartCast set isSourceInCast");
371
372 SLOGI("no set continuous task in service");
373 HISYSEVENT_BEHAVIOR("SESSION_CAST",
374 "BUNDLE_NAME", session->GetDescriptor().elementName_.GetBundleName(),
375 "MODULE_NAME", session->GetDescriptor().elementName_.GetModuleName(),
376 "ABILITY_NAME", session->GetDescriptor().elementName_.GetAbilityName(),
377 "SESSION_PID", session->GetDescriptor().pid_, "SESSION_UID", session->GetDescriptor().uid_,
378 "SESSION_ID", session->GetDescriptor().sessionId_, "SESSION_TAG", session->GetDescriptor().sessionTag_,
379 "SESSION_TYPE", session->GetDescriptor().sessionType_, "DETAILED_MSG", "start cast session");
380 return AVSESSION_SUCCESS;
381 }
382
StopCast(const SessionToken & sessionToken)383 int32_t AVSessionService::StopCast(const SessionToken& sessionToken)
384 {
385 sptr<AVSessionItem> session = GetUsersManager().GetContainerFromAll().GetSessionById(sessionToken.sessionId);
386 CHECK_AND_RETURN_RET_LOG(session != nullptr, AVSESSION_SUCCESS, "StopCast: session is not exist");
387 CHECK_AND_RETURN_RET_LOG(session->StopCast() == AVSESSION_SUCCESS, AVSESSION_ERROR, "StopCast failed");
388 if (session->GetDescriptor().sessionTag_ == "RemoteCast") {
389 SLOGI("Stop cast at sink, start destroy sink avsession task");
390 HandleSessionRelease(sessionToken.sessionId);
391 return AVSESSION_SUCCESS;
392 }
393
394 SLOGI("no set continuous task in service");
395 return AVSESSION_SUCCESS;
396 }
397
NotifyMirrorToStreamCast()398 void AVSessionService::NotifyMirrorToStreamCast()
399 {
400 for (auto& session : GetContainer().GetAllSessions()) {
401 if (session && topSession_ && (session.GetRefPtr() == topSession_.GetRefPtr())) {
402 MirrorToStreamCast(session);
403 }
404 }
405 if (castserviceNameStatePair_.second == deviceStateDisconnection) {
406 DeviceInfo localDeviceInfo;
407 AVRouter::GetInstance().SetServiceAllConnectState(-1, localDeviceInfo);
408 }
409 }
410
IsMirrorToStreamCastAllowed(sptr<AVSessionItem> & session)411 bool AVSessionService::IsMirrorToStreamCastAllowed(sptr<AVSessionItem>& session)
412 {
413 bool deviceCond = isSupportMirrorToStream_ &&
414 session->GetDescriptor().sessionType_ == AVSession::SESSION_TYPE_VIDEO &&
415 !AppManagerAdapter::GetInstance().IsAppBackground(session->GetUid(), session->GetPid());
416
417 bool connectCond = !is2in1_ && (castserviceNameStatePair_.second == deviceStateConnection);
418
419 return deviceCond && connectCond;
420 }
421
MirrorToStreamCast(sptr<AVSessionItem> & session)422 __attribute__((no_sanitize("cfi"))) int32_t AVSessionService::MirrorToStreamCast(sptr<AVSessionItem>& session)
423 {
424 SLOGI("enter MirrorToStreamCast");
425 if (!IsMirrorToStreamCastAllowed(session)) {
426 return AVSESSION_SUCCESS;
427 }
428 checkEnableCast(true);
429 DeviceInfo deviceInfo;
430 deviceInfo.deviceId_ = castDeviceId_;
431 deviceInfo.deviceName_ = castDeviceName_;
432 deviceInfo.deviceType_ = castDeviceType_;
433 deviceInfo.castCategory_ = AVCastCategory::CATEGORY_REMOTE;
434 deviceInfo.supportedProtocols_ = ProtocolType::TYPE_CAST_PLUS_STREAM;
435 deviceInfo.providerId_ = 1;
436 return session->RegisterListenerStreamToCast(castserviceNameStatePair_, deviceInfo);
437 }
438
SetIsSupportMirrorToStream(bool isSupportMirrorToStream)439 void AVSessionService::SetIsSupportMirrorToStream(bool isSupportMirrorToStream)
440 {
441 isSupportMirrorToStream_ = isSupportMirrorToStream;
442 }
443
ReportStartCastBegin(std::string func,const OutputDeviceInfo & outputDeviceInfo,int32_t uid)444 void AVSessionService::ReportStartCastBegin(std::string func, const OutputDeviceInfo& outputDeviceInfo, int32_t uid)
445 {
446 AVSessionRadarInfo info(func);
447 info.bundleName_ = BundleStatusAdapter::GetInstance().GetBundleNameFromUid(uid);
448 AVSessionRadar::GetInstance().StartCastBegin(outputDeviceInfo, info);
449 }
450
ReportStartCastEnd(std::string func,const OutputDeviceInfo & outputDeviceInfo,int32_t uid,int ret)451 void AVSessionService::ReportStartCastEnd(std::string func, const OutputDeviceInfo& outputDeviceInfo,
452 int32_t uid, int ret)
453 {
454 AVSessionRadarInfo info(func);
455 info.bundleName_ = BundleStatusAdapter::GetInstance().GetBundleNameFromUid(uid);
456 if (ret == AVSESSION_SUCCESS) {
457 AVSessionRadar::GetInstance().StartCastEnd(outputDeviceInfo, info);
458 } else {
459 info.errorCode_ = AVSessionRadar::GetRadarErrorCode(ret);
460 AVSessionRadar::GetInstance().FailToStartCast(outputDeviceInfo, info);
461 }
462 }
463 #endif
464
AVSessionSystemAbilityLoadCallback(AVSessionService * ptr)465 AVSessionSystemAbilityLoadCallback::AVSessionSystemAbilityLoadCallback(AVSessionService *ptr)
466 {
467 SLOGI("AVSessionSystemAbilityLoadCallback construct");
468 servicePtr_ = ptr;
469 }
470
~AVSessionSystemAbilityLoadCallback()471 AVSessionSystemAbilityLoadCallback::~AVSessionSystemAbilityLoadCallback()
472 {
473 SLOGI("AVSessionSystemAbilityLoadCallback destruct");
474 }
475
OnLoadSACompleteForRemote(const std::string & deviceId,int32_t systemAbilityId,const sptr<IRemoteObject> & remoteObject)476 void AVSessionSystemAbilityLoadCallback::OnLoadSACompleteForRemote(const std::string& deviceId,
477 int32_t systemAbilityId, const sptr<IRemoteObject>& remoteObject)
478 {
479 SLOGI("OnLoadSACompleteForRemote systemAbilityId:%{public}d, loaded with object:%{public}d",
480 systemAbilityId, static_cast<int>(remoteObject != nullptr));
481 }
482
AVSessionDeviceStateCallback(AVSessionService * ptr)483 AVSessionDeviceStateCallback::AVSessionDeviceStateCallback(AVSessionService *ptr)
484 {
485 SLOGI("AVSessionDeviceStateCallback construct");
486 servicePtr_ = ptr;
487 }
~AVSessionDeviceStateCallback()488 AVSessionDeviceStateCallback::~AVSessionDeviceStateCallback()
489 {
490 SLOGI("AVSessionDeviceStateCallback destruct");
491 }
492
OnDeviceOnline(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)493 void AVSessionDeviceStateCallback::OnDeviceOnline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
494 {
495 SLOGI("AVSessionDeviceStateCallback OnDeviceOnline %{public}d", static_cast<int>(deviceInfo.deviceTypeId));
496 }
497
OnDeviceReady(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)498 void AVSessionDeviceStateCallback::OnDeviceReady(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
499 {
500 SLOGI("AVSessionDeviceStateCallback OnDeviceReady %{public}d", static_cast<int>(deviceInfo.deviceTypeId));
501 CHECK_AND_RETURN_LOG(servicePtr_ != nullptr, "OnDeviceReady get servicePtr_ nullptr");
502 if (servicePtr_->ProcessTargetMigrate(true, deviceInfo)) {
503 SLOGI("OnDeviceReady ProcessTargetMigrate pass");
504 }
505 }
506
OnDeviceOffline(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)507 void AVSessionDeviceStateCallback::OnDeviceOffline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
508 {
509 SLOGI("AVSessionDeviceStateCallback OnDeviceOffline %{public}d", static_cast<int>(deviceInfo.deviceTypeId));
510 CHECK_AND_RETURN_LOG(servicePtr_ != nullptr, "OnDeviceOffline get servicePtr_ nullptr");
511 if (servicePtr_->ProcessTargetMigrate(false, deviceInfo)) {
512 SLOGI("OnDeviceOffline ProcessTargetMigrate pass");
513 }
514 }
515
OnDeviceChanged(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)516 void AVSessionDeviceStateCallback::OnDeviceChanged(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
517 {
518 SLOGD("AVSessionDeviceStateCallback OnDeviceChanged %{public}d", static_cast<int>(deviceInfo.deviceTypeId));
519 }
520
GetLocalDeviceType()521 int32_t AVSessionService::GetLocalDeviceType()
522 {
523 int32_t deviceType = -1;
524 int32_t ret = DistributedHardware::DeviceManager::GetInstance().GetLocalDeviceType(serviceName, deviceType);
525 CHECK_AND_RETURN_RET_LOG(ret == 0, AVSESSION_ERROR, "get local device type failed with ret:%{public}d", ret);
526 return deviceType;
527 }
528
DoTargetDevListenWithDM()529 void AVSessionService::DoTargetDevListenWithDM()
530 {
531 localDeviceType_ = GetLocalDeviceType();
532 targetDeviceType_ = (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_WATCH) ?
533 DistributedHardware::DmDeviceType::DEVICE_TYPE_PHONE : DistributedHardware::DmDeviceType::DEVICE_TYPE_WATCH;
534 SLOGI("get localDeviceType:%{public}d", localDeviceType_);
535
536 std::vector<DistributedHardware::DmDeviceInfo> deviceList;
537 int32_t ret = GetTrustedDevicesInfo(deviceList);
538 CHECK_AND_PRINT_LOG(ret == AVSESSION_SUCCESS, "get trusted devcie list fail with ret:%{public}d", ret);
539 for (DistributedHardware::DmDeviceInfo& deviceInfo : deviceList) {
540 if (ProcessTargetMigrate(true, deviceInfo)) {
541 SLOGI("GetTrustedDevicesInfo find target");
542 }
543 }
544
545 deviceStateCallback_ = std::make_shared<AVSessionDeviceStateCallback>(this);
546 ret = DistributedHardware::DeviceManager::GetInstance().
547 RegisterDevStateCallback(serviceName, "extra", deviceStateCallback_);
548 SLOGE("RegisterDevStateCallback with ret:%{public}d", ret);
549 }
550
ProcessTargetMigrate(bool isOnline,const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)551 bool AVSessionService::ProcessTargetMigrate(bool isOnline, const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
552 {
553 if (deviceInfo.deviceTypeId != targetDeviceType_ || !CheckWhetherTargetDevIsNext(deviceInfo)) {
554 SLOGE("ProcessTargetMigrate wtih deviceType:%{public}d or version not fit", deviceInfo.deviceTypeId);
555 return false;
556 }
557 if (!isOnline) {
558 isMigrateTargetFound_ = false;
559 DoDisconnectProcessWithMigrate(deviceInfo);
560 deviceIdForMigrate_ = "";
561 } else {
562 isMigrateTargetFound_ = true;
563 deviceIdForMigrate_ = std::string(deviceInfo.deviceId);
564 DoConnectProcessWithMigrate(deviceInfo);
565 if (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_PHONE) {
566 DoRemoteAVSessionLoad(deviceIdForMigrate_);
567 }
568 }
569 return true;
570 }
571
DoRemoteAVSessionLoad(std::string remoteDeviceId)572 void AVSessionService::DoRemoteAVSessionLoad(std::string remoteDeviceId)
573 {
574 SLOGI("DoRemoteAVSessionLoad async with deviceId:%{public}s", remoteDeviceId.c_str());
575 AVSessionEventHandler::GetInstance().AVSessionPostTask(
576 [this, remoteDeviceId]() {
577 auto mgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
578 if (mgr == nullptr) {
579 SLOGE("DoRemoteAVSessionLoad get SystemAbilityManager fail");
580 return;
581 }
582 abilityLoadCallback_ = new AVSessionSystemAbilityLoadCallback(this);
583 sptr<IRemoteObject> remoteObject = nullptr;
584 uint8_t outOfTime = doRemoteLoadRetryTime;
585 while (remoteObject == nullptr && outOfTime > 0) {
586 outOfTime--;
587 std::this_thread::sleep_for(std::chrono::milliseconds(CLICK_TIMEOUT));
588 remoteObject = mgr->CheckSystemAbility(AVSESSION_SERVICE_ID, remoteDeviceId);
589 if (remoteObject != nullptr) {
590 SLOGI("DoRemoteAVSessionLoad done with remoteObject get");
591 return;
592 } else {
593 SLOGI("DoRemoteAVSessionLoad get null, retryLeftTime:%{public}u", outOfTime);
594 }
595 }
596 },
597 "DoRemoteAVSessionLoad");
598 }
599
DoConnectProcessWithMigrate(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)600 void AVSessionService::DoConnectProcessWithMigrate(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
601 {
602 if (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_PHONE) {
603 DoConnectProcessWithMigrateServer(deviceInfo);
604 } else {
605 DoConnectProcessWithMigrateProxy(deviceInfo);
606 }
607 }
608
DoConnectProcessWithMigrateServer(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)609 void AVSessionService::DoConnectProcessWithMigrateServer(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
610 {
611 SLOGI("DoConnectProcessWithMigrateServer with deviceType:%{public}d", deviceInfo.deviceTypeId);
612 std::string networkId = std::string(deviceInfo.networkId);
613 if (migrateAVSessionServerMap_.find(networkId) == migrateAVSessionServerMap_.end()) {
614 std::shared_ptr<MigrateAVSessionServer> migrateAVSessionServer =
615 std::make_shared<MigrateAVSessionServer>(MIGRATE_MODE_NEXT);
616 migrateAVSessionServer->Init(this);
617 migrateAVSessionServer->LocalFrontSessionArrive(localFrontSessionId_);
618 MigrateAVSessionManager::GetInstance().CreateLocalSessionStub(MigrateAVSessionManager::migrateSceneNext,
619 migrateAVSessionServer);
620 migrateAVSessionServerMap_.insert({networkId, migrateAVSessionServer});
621 SLOGI("DoConnectProcessWithMigrateServer create migrate server success");
622 } else {
623 SLOGE("DoConnectProcessWithMigrateServer find migrate server already alive");
624 }
625 }
626
DoConnectProcessWithMigrateProxy(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)627 void AVSessionService::DoConnectProcessWithMigrateProxy(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
628 {
629 SLOGI("DoConnectProcessWithMigrateProxy with deviceType:%{public}d", deviceInfo.deviceTypeId);
630 std::string networkId = std::string(deviceInfo.networkId);
631 if (migrateAVSessionProxyMap_.find(networkId) == migrateAVSessionProxyMap_.end()) {
632 std::shared_ptr<MigrateAVSessionProxy> migrateAVSessionProxy =
633 std::make_shared<MigrateAVSessionProxy>(this);
634 MigrateAVSessionManager::GetInstance().CreateRemoteSessionProxy(networkId,
635 MigrateAVSessionManager::migrateSceneNext, migrateAVSessionProxy);
636 migrateAVSessionProxyMap_.insert({networkId, std::static_pointer_cast<SoftbusSession>(migrateAVSessionProxy)});
637 SLOGI("DoConnectProcessWithMigrateProxy create migrate proxy success");
638 } else {
639 SLOGE("DoConnectProcessWithMigrateProxy find migrate proxy already alive");
640 }
641 }
642
DoDisconnectProcessWithMigrate(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)643 void AVSessionService::DoDisconnectProcessWithMigrate(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
644 {
645 if (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_PHONE) {
646 DoDisconnectProcessWithMigrateServer(deviceInfo);
647 } else {
648 DoDisconnectProcessWithMigrateProxy(deviceInfo);
649 }
650 }
651
DoDisconnectProcessWithMigrateServer(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)652 void AVSessionService::DoDisconnectProcessWithMigrateServer(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
653 {
654 SLOGI("DoDisconnectProcessWithMigrateServer with deviceType:%{public}d", deviceInfo.deviceTypeId);
655 std::string networkId = std::string(deviceInfo.networkId);
656 MigrateAVSessionManager::GetInstance().ReleaseLocalSessionStub(MigrateAVSessionManager::migrateSceneNext);
657 if (migrateAVSessionServerMap_.find(networkId) != migrateAVSessionServerMap_.end()) {
658 migrateAVSessionServerMap_.erase(networkId);
659 } else {
660 SLOGE("DoDisconnectProcessWithMigrateServer find networkId not exist");
661 }
662 }
663
DoDisconnectProcessWithMigrateProxy(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)664 void AVSessionService::DoDisconnectProcessWithMigrateProxy(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
665 {
666 SLOGI("DoDisconnectProcessWithMigrateProxy with networkId:%{public}s", deviceInfo.networkId);
667 std::string networkId = std::string(deviceInfo.networkId);
668 MigrateAVSessionManager::GetInstance().ReleaseRemoteSessionProxy(networkId,
669 MigrateAVSessionManager::migrateSceneNext);
670 if (migrateAVSessionProxyMap_.find(networkId) != migrateAVSessionProxyMap_.end()) {
671 migrateAVSessionProxyMap_.erase(networkId);
672 } else {
673 SLOGE("DoDisconnectProcessWithMigrateProxy find networkId not exist");
674 }
675 }
676
UpdateLocalFrontSession(std::shared_ptr<std::list<sptr<AVSessionItem>>> sessionListForFront)677 void AVSessionService::UpdateLocalFrontSession(std::shared_ptr<std::list<sptr<AVSessionItem>>> sessionListForFront)
678 {
679 CHECK_AND_RETURN_LOG(sessionListForFront != nullptr, "UpdateLocalFrontSession get sessionListForFront nullptr");
680 std::string preloadSessionId;
681 if (sessionListForFront->size() <= 0) {
682 SLOGI("UpdateLocalFrontSession with empty list");
683 preloadSessionId = "";
684 NotifyLocalFrontSessionChangeForMigrate(preloadSessionId);
685 return;
686 }
687 if (topSession_ != nullptr && !topSession_->IsCasting()) {
688 preloadSessionId = topSession_->GetSessionId();
689 NotifyLocalFrontSessionChangeForMigrate(preloadSessionId);
690 return;
691 }
692 for (const auto& session : *sessionListForFront) {
693 if (session == nullptr || session->IsCasting()) {
694 continue;
695 }
696 preloadSessionId = session->GetSessionId();
697 break;
698 }
699 NotifyLocalFrontSessionChangeForMigrate(preloadSessionId);
700 }
701
NotifyLocalFrontSessionChangeForMigrate(std::string localFrontSessionIdUpdate)702 void AVSessionService::NotifyLocalFrontSessionChangeForMigrate(std::string localFrontSessionIdUpdate)
703 {
704 SLOGI("NotifyLocalFrontSessionChangeForMigrate with sessionId:%{public}s",
705 AVSessionUtils::GetAnonySessionId(localFrontSessionIdUpdate).c_str());
706 if (migrateAVSessionServerMap_.size() <= 0) {
707 SLOGE("NotifyLocalFrontSessionChangeForMigrate with no migrate");
708 localFrontSessionId_ = localFrontSessionIdUpdate;
709 return;
710 }
711 for (auto it = migrateAVSessionServerMap_.begin(); it != migrateAVSessionServerMap_.end(); it++) {
712 std::shared_ptr<MigrateAVSessionServer> migrateAVSessionServer = it->second;
713 if (migrateAVSessionServer == nullptr) {
714 SLOGE("notify session change but get migrateserver null, continue");
715 continue;
716 }
717 if (localFrontSessionId_.empty() && localFrontSessionIdUpdate.length() > 0) {
718 DoRemoteAVSessionLoad(deviceIdForMigrate_);
719 migrateAVSessionServer->LocalFrontSessionArrive(localFrontSessionIdUpdate);
720 } else if (!localFrontSessionId_.empty() && localFrontSessionIdUpdate.length() > 0
721 && localFrontSessionId_ != localFrontSessionIdUpdate) {
722 migrateAVSessionServer->LocalFrontSessionChange(localFrontSessionIdUpdate);
723 } else if (!localFrontSessionId_.empty() && localFrontSessionIdUpdate.empty()) {
724 DoRemoteAVSessionLoad(deviceIdForMigrate_);
725 migrateAVSessionServer->LocalFrontSessionLeave(localFrontSessionId_);
726 }
727 }
728 localFrontSessionId_ = localFrontSessionIdUpdate;
729 }
730
CheckWhetherTargetDevIsNext(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)731 bool AVSessionService::CheckWhetherTargetDevIsNext(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
732 {
733 Json::Reader reader;
734 Json::Value jsonData;
735 if (!reader.parse(deviceInfo.extraData, jsonData)) {
736 SLOGE("CheckWhetherTargetDevIsNext json parse failed");
737 return false;
738 }
739 if (jsonData.isMember("OS_TYPE")) {
740 Json::Value osValue = jsonData["OS_TYPE"];
741 if (osValue.isNumeric()) {
742 double number = osValue.asDouble();
743 if (number > 0) {
744 return true;
745 }
746 }
747 }
748 return false;
749 }
750
GetDistributedSessionControllersInner(const DistributedSessionType & sessionType,std::vector<sptr<IRemoteObject>> & sessionControllers)751 int32_t AVSessionService::GetDistributedSessionControllersInner(const DistributedSessionType& sessionType,
752 std::vector<sptr<IRemoteObject>>& sessionControllers)
753 {
754 if (sessionType == DistributedSessionType::TYPE_SESSION_REMOTE && !migrateAVSessionProxyMap_.empty()) {
755 for (const auto& pair : migrateAVSessionProxyMap_) {
756 std::shared_ptr<MigrateAVSessionProxy> migrateAVSessionProxy =
757 std::static_pointer_cast<MigrateAVSessionProxy>(pair.second);
758 CHECK_AND_CONTINUE(migrateAVSessionProxy != nullptr);
759 migrateAVSessionProxy->GetDistributedSessionControllerList(sessionControllers);
760 }
761 } else {
762 SLOGE("GetDistributedSessionControllersInner with err type:%{public}d|proxyEmpty:%{public}d",
763 static_cast<int>(sessionType), static_cast<int>(migrateAVSessionProxyMap_.empty()));
764 return ERR_REMOTE_CONNECTION_NOT_EXIST;
765 }
766 SLOGI("GetDistributedSessionControllersInner with size:%{public}d", static_cast<int>(sessionControllers.size()));
767 return AVSESSION_SUCCESS;
768 }
769
NotifyRemoteBundleChange(const std::string bundleName)770 void AVSessionService::NotifyRemoteBundleChange(const std::string bundleName)
771 {
772 if (migrateAVSessionProxyMap_.empty()) {
773 SLOGE("not in migrate proxy scene, return");
774 return;
775 }
776 PublishEvent(bundleName.empty() ? remoteMediaNone : remoteMediaAlive);
777 }
778 }